为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?

Posted

技术标签:

【中文标题】为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?【英文标题】:Why .NET framework project can be added as reference in .NET Standard 2.0 project?为什么 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中? 【发布时间】:2020-09-15 21:47:09 【问题描述】:

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

为什么 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?

【问题讨论】:

找到了一些链接,例如:***.com/questions/57688855/…,但不是很清楚为什么会这样? 查看 .NET Standard 2.0 的初始 announcement。具体来说,这就是我们添加允许 .NET Standard 项目引用 .NET Framework 库的兼容模式的原因。虽然这可能不适用于所有情况(例如,如果 .NET Framework 二进制文件使用 WPF),但我们发现 nuget.org 上 70% 的 NuGet 包的 API 与 .NET Standard 2.0 兼容。 【参考方案1】:

当您拥有 .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 和所有必需的类型。 p>

但是 .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 兼容性 Shim

【讨论】:

关于跨平台使用的注意事项:由于此兼容性 shim 使用 Registry(参见 this answer 附图),并且 Registry 是 Windows 概念,因此不适用于 .NET Core 运行在 macOS 或 Linux 上。因此,如果您希望 .NET Standard 库支持 .NET Core 中的跨平台功能,请仅保留对其他 .NET Standard 库的引用。 (留给未来读者的注意事项 - 只是扩展您的答案,谢尔盖。)

以上是关于为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?的主要内容,如果未能解决你的问题,请参考以下文章

针对 .NET 框架的多个版本的最佳方法是啥?

如何将 .NET 框架添加到我的项目中?

为啥将我的目标框架从“.NET Framework 4 Client Profile”更改为“.NET Framework 4”会出现警告消息?

在我的类库项目中看不到框架4.6.2作为选项

为啥实体框架核心加载实体的关系而不添加包含

为啥win7安装dotNet4.0失败