我有一个运行良好的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?
答案 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'。'
屏幕截图:
总而言之,这是:您的代码是否在具有完整框架的盒子上运行并不重要。如果您从针对Asp.Net Core 3的网站引用了完整框架库,并调用了引用与Asp.Net Core 3不兼容的type
的方法,那么会抛出 em>。