能否从ASP.NET Core MVC项目中引用.NET Framework 4.7.2类库?

7
我有一个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?

如果该产品尚未更新以符合.NET Core或.NET Standard的规范,我将寻找另一种解决方案。我对SAP对此的回应感到惊讶,显然他们不支持.NET Core,因为它太“轻”,哇。 - DavidG
2个回答

24

.NET Core不支持包含.NET Framework库,没有任何例外。但是,.NET Core支持.NET Standard,并且由于.NET Framework也实现了.NET Standard,微软在编译器中做出了一个特殊的例外,允许您包括.NET Framework库,但有个警告:它们可能根本不起作用或者完全无法工作。当你在.NET Core项目中包括.NET Framework库时会收到这样的警告,而你需要确保库正确地端到端工作。

绝大多数.NET Framework库都可以工作,只要它们不使用.NET Framework特定的API(尤其是Windows特定的API)。如果使用了这些API,则它们将无法工作。

在这里,库似乎使用了Windows特定的API,这意味着它与.NET Core不兼容。在这种情况下,您仍然可以创建一个ASP.NET Core项目,但必须针对.NET Framework而不是.NET Core进行目标设置。也就是说,在ASP.NET Core 3.0之前,您需要使用.NET Framework。ASP.NET Core 3.0+依赖于.NET Standard 2.1,而.NET Framework的任何版本都不支持或将来都不会支持。

因此,如果您需要使用不完全符合.NET Standard 2.0的.NET Framework库,则必须针对.NET Framework进行目标设置,如果您必须针对.NET Framework进行目标设置,则您的ASP.NET Core版本将被锁定在2.2。

更新

这篇答案已经有点老了,但是如果还有用的话,我个人处理这种情况的方法是创建一个非常小而简单的API。基本上,你需要创建一个ASP.NET Core 2.1(LTS)应用程序,针对.NET Framework,并且这个应用程序只与.NET Framework库进行交互。在这里,这意味着创建报告。然后,你可以创建一个实际的应用程序作为ASP.NET Core 3.1+应用程序,针对.NET Core,并且只需调用API获取所需的数据、报告或其他内容。这有点像一种轻量级的微服务方法。


12

Chris已经提供了一份优秀而准确的答案,但我会尝试通过分享我做的实验结果来增加一些色彩。

实验:我的Web应用程序目标是.Net Core 3.1。它调用了一个针对Full Framework的库。在那个库中,我特别调用了一个Full Framework API,这个API在.Net Core 3.1中不可用,在这种情况下,该类型为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);
            }
        }
在我的网络应用程序的主控制器中,我这样调用使用该库的方法:
       public IActionResult Index() {
            string hash = App.Lib.Sha512Hash("hello world");

            return View();
        }

实验很简单。此代码正在运行于已安装完整框架的Windows机器上。如果我从一个针对完整框架的网站调用此库,它将完美运行。

当我从一个 .Net Core 3.1 网站调用库中的方法时会发生什么呢?这就是我想要通过该实验回答的问题。

答案是...

它会抛出以下异常:

 

System.TypeLoadException: 'Could not load type 'System.Security.Cryptography.SHA512Cng' from assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.'

截图:

enter image description here

所以结论是:你的代码是否在具有完整框架的计算机上运行并不重要。如果你从一个针对 Asp.Net Core 3 的网站引用了一个完整框架库,并调用了一个引用与 Asp.Net Core 3 不兼容的类型的方法,那么它将会抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接