.NET Standard 类库的编译与 .NET Framework 有何不同?

Posted

技术标签:

【中文标题】.NET Standard 类库的编译与 .NET Framework 有何不同?【英文标题】:How is a compilation of a .NET Standard class library different than .NET Framework? 【发布时间】:2018-01-19 00:13:48 【问题描述】:

编译 .NET Standard 项目会给我一个 dll。 .NET Standard 项目也可以有依赖项,因此代码被编译成某种东西。这与 .NET Framework 或 .NET Core 项目时编译的内容有何不同。

我在创建类库时是否只是“扩展”了 .NET Standard 的实现?

我读过的所有内容都将 .NET Standard 与接口进行比较,将 .NET Core/.NET Framework 与这些接口的某些版本进行比较。

我的问题是,如果这是真的,我该如何创建一个实际的 .NET Standard 库。为什么我不能引用使用任何版本的 .NET Standard 的 .NET Standard 库(例如:.NET Framework 4.5 应该能够使用 .NET Standard 2.0 类库,因为它显然已经在编译)?

【问题讨论】:

谷歌搜索“如何构建 .NET 标准库”时的第一击 - Building a class library with C# and .NET Core in Visual Studio 2017。 NET Framework 4.5 should be able to use a .NET Standard 2.0 class library - 不是根据 this chart - 您至少需要 .NET Framework 4.6.1 才能引用 .NET Standard 2.0。由于明显缺乏寻找答案的努力,我投了反对票。 @NightOwl888 我想你误会了。问题不在于 .NET 4.5 是否可以使用 .NET Standard 2.0,而是在编译 .NET Standard 代码时为什么不能。 【参考方案1】:

据我了解,当您针对 .NET Standard 进行编译时,您实际上是针对模型进行编译,即包含由 .NET Standard 定义但没有实现的公共接口的程序集。在运行时,这些模型被包含转发到实际实现的类型的程序集替换。替换是有效的,因为模型和这些类型的转发程序集具有相同的签名。但是,这些类型转发程序集并不适用于 .NET Framework 的每个版本,实际上仅适用于最近的版本。

【讨论】:

【参考方案2】:

根据微软的定义:

.NET Standard 是所有 .NET 平台都必须具备的一组 API 实施。

请注意,.NET Standard 已冻结。新的 API 首先在 .NET Core 或 .NET Framework 中可用,然后在经过委员会审查后,也可以在 .NET Standard 中添加。 个人根据上述定义,如果我想开发一个通用库,我将在产品开发生命周期中使用它,那么我更愿意通过使用 .NET Standard 使其更加独立于框架。 更多您可以找到here。

【讨论】:

以上是关于.NET Standard 类库的编译与 .NET Framework 有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

将 .NET Core 2.0 类库转换为 .NET Standard

将依赖注入与 .NET Core 类库 (.NET Standard) 结合使用

netstandard2.0 (.net standard 2.0) 类库不能引用 net461 (.net framework 4.6.1) 类库

NET Standard vs Net Core App:创建 .NET Core 项目时(使用控制台或类库)

C#/.NET第六期01C#基础_01:运行环境新建C#程序的流程严格区分大小写类库的含义

为什么在一个解决方案中混合.Net Standard和.Net Core项目?