.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获取所需的数据、报告或其他内容。这有点像一种轻量级的微服务方法。
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'.'
截图:
所以结论是:你的代码是否在具有完整框架的计算机上运行并不重要。如果你从一个针对 Asp.Net Core 3 的网站引用了一个完整框架库,并调用了一个引用与 Asp.Net Core 3 不兼容的类型的方法,那么它将会抛出异常。