是否可以从ASP.NET Core MVC项目中引用.net Framework 4.7.2类库?

时间:2019-11-01 11:12:10

标签: asp.net .net asp.net-core .net-core asp.net-core-mvc

我有一个运行良好的ASP.NET MVC 5项目,它还引用了一个.NET Framework 4.7.2类库,该类库生成了一些CrystalReports。 CrystalReports不支持.NET Core,因此该类库将与完整的.NET Framework一起使用。

现在,如果我将ASP.NET MVC 5升级到ASP.NET Core 2(或3),我将能够引用类库并可能生成那些CrystalReports?

2 个答案:

答案 0 :(得分:2)

.NET Core不支持包含.NET Framework库。期。但是,.NET Core支持.NET Standard,并且由于.NET Framework也实现.NET Standard,因此Microsoft在编译器中做了一个特殊的例外,允许您包括.NET Framework库,但请注意,它们可能实际上根本不起作用或完全。当您在.NET Core项目中包含.NET Framework库时,您会收到有关此效果的警告,并且您必须确保该库端到端正确运行。

.NET Framework库中的大多数 都可以工作,只要它们不使用.NET Framework特定的API(尤其是Windows特定的API)即可。如果这样做,那么它们将无法工作。

在这里,该库确实使用Windows特定的API,这意味着它与.NET Core不兼容。在这种情况下,您仍然可以创建一个ASP.NET Core项目,但是必须 目标是.NET Framework,而不是.NET Core。也就是说,直到不能以.NET Framework为目标的ASP.NET Core 3.0为止。 ASP.NET Core 3.0+依赖于.NET Standard 2.1,而没有任何版本的.NET Framework支持或永远不会。

因此,如果您需要使用不符合100%.NET Standard 2.0的.NET Framework库,则必须以.NET Framework为目标,如果必须以.NET Framework为目标,则必须将版本锁定在2.2。ASP.NET Core。

答案 1 :(得分:0)

克里斯已经提供了一个出色而准确的答案,但是我将通过分享我做的实验结果来尝试增加一些色彩。

实验:我有一个Web应用程序以.Net Core 3.1为目标。它调用针对完整框架的库。在该库中,我专门调用了.Net Core 3.1中不可用的Full Framework API,在这种情况下,类型为SHA512Cng

我的图书馆代码是:

        /// <summary>
        /// Returns a base64 encoded Sha512 hash of the text specified.
        /// Uses the SHA512Cng implementation to do the hashing.
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static string Sha512Hash(string text) {

            using (SHA512Cng sha512Cng = new SHA512Cng()) {
                byte[] bytes = Encoding.ASCII.GetBytes(text);
                byte[] hashButes = sha512Cng.ComputeHash(bytes);
                return Convert.ToBase64String(hashButes);
            }
        }

在Web应用程序的主控制器中,我像这样使用该Library方法进行调用:

       public IActionResult Index() {
            string hash = App.Lib.Sha512Hash("hello world");

            return View();
        }

非常简单的实验。此代码在已安装完整框架的Windows计算机上运行。如果我从以“完整框架”为目标的网站调用此库,则它可以完美运行。

当我从.Net Core 3.1网站在库中调用此方法时,会发生什么情况?这就是我希望本实验回答的问题。

答案是...

它引发以下异常:

  

System.TypeLoadException:'无法从程序集'System.Core,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'中加载类型'System.Security.Cryptography.SHA512Cng'。'

屏幕截图:

enter image description here

总而言之,这是:您的代码是否在具有完整框架的盒子上运行并不重要。如果您从针对Asp.Net Core 3的网站引用了完整框架库,并调用了引用与Asp.Net Core 3不兼容的type的方法,那么会抛出 em>。