为什么.NET Framework项目可以被添加为.NET Standard 2.0项目的引用?

3

在将 .NET Framework 4.6.2 项目转换为 .NET Standard 项目时,我发现可以在 .NET Standard 项目中添加 .NET Framework 项目引用,这在理论上听起来并不正确。

为什么 .NET Framework 项目可以被添加为 .NET Standard 2.0 项目的引用?


发现了一些链接,例如:https://dev59.com/x7Xna4cB1Zd3GeqPTvp3,但不是很清楚为什么会出现这种情况? - ggtffg
3
请参阅 .NET Standard 2.0 的初始公告。具体来说,“这就是为什么我们添加了兼容模式,使得 .NET Standard 项目可以引用 .NET Framework 库。虽然这种方法可能并非在所有情况下都有效(例如,如果 .NET Framework 二进制文件使用 WPF),但我们发现,nuget.org 上所有 NuGet 包中有 70% 与 .NET Standard 2.0 兼容。” - Kirk Larkin
1个回答

3
当你有.NET Standard项目时,它会被编译成netstandard.dll。.NET Framework和.NET Core都有netstandard.dll(它提供了对mscorlib.dll或System.Runtime.dll的类型转发),因此你可以在.NET Core和.NET Framework中都使用.NET Standard项目。
那么当你的.NET Standard项目引用.NET Framework项目(它是针对mscorlib.dll编译的)时会发生什么?
如果你有引用链.NET Framework -> .NET Standard -> .NET Framework,那么没有任何问题,因为在运行时你有带有所有所需类型的mscorlib.dll。
但是.NET Core -> .NET Standard -> .NET Framework引用呢?在运行时,你只有System.Runtime.dll。对于.NET Standard项目来说没有问题,因为netstandard.dll将类型转发到System.Runtime.dll。但是问题在于.NET Core也有mscorlib.dll!没错,它也只是转发到System.Runtime.dll类型。一切就像预期的那样工作,直到你使用在System.Runtime.dll中不存在的某些.NET Framework类型。
进一步阅读:.NET Framework Compatibility Shim

3
关于跨平台使用的说明:由于此兼容性垫片使用注册表(参见此答案,其中包含图表),而注册表是Windows的概念,因此在macOS或Linux上运行的.NET Core将无法使用。因此,如果您希望您的.NET Standard库在.NET Core中支持跨平台功能,请仅保留对其他.NET Standard库的引用。(注意给未来读者的说明 - 只是对您的答案进行了扩展,Sergey。) - Sean Skelly

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