.NET 标准与 .NET 核心

.NET Standard vs .NET Core

我看过 .NET Standard 和 .NET Core 之间的区别,但我真的不知道区别是什么,或者什么时候选择 .NET Standard 库项目以及什么时候选择 .NET Core图书馆项目。

我读到 .NET Standard 是为了确保一组 API 始终可用,无论使用什么平台(只要该平台与我选择的 .NET Standard 版本兼容)。如果我没记错的话,这意味着我可以创建一个 class .NET Standard 库,然后在与我选择的 .NET Standard 版本兼容的任何平台上使用它。

对于 .NET Core,我了解到它也适用于跨平台使用,因此如果我选择 .NET Core 库,似乎我也可以在许多平台上使用它,就像 .NET Standard .

最后,我看不出有什么不同。我什么时候应该使用哪个?它们有什么区别?

.NET Core 是 .NET Standard 的一个实现。它在多个操作系统上可用,但这不是一回事 - 还有 .NET Standard 的其他实现。

因此,如果您创建 .NET Core 库,它将可以访问在 .NET Core 中实现的内容,但不是 .NET Standard 的一部分,并且您的库将与 其他 .NET Standard 实现不兼容,例如 Xamarin、Tizen、完整的 .NET 桌面框架等

简而言之:要实现最大的可移植性,请使您的库以 .NET Standard 为目标。

我会尝试进一步澄清您的疑问并扩展 Jon Skeet 的回答。

.NET Standard 是一个规范,因此针对特定 .NET Standard 版本编译的库可用于不同的 .NET Standard 实现。

正如我在其他评论中所说,.NET Standard 与其他 .NET Standard 实现(.NET Core、.NET Framework 等)之间关系的一个很好的类比是 this gist by David Fowler:.NET Standard 版本是 Interfaces,而框架是这些接口的实现。

这张简化图可能有助于理解这种关系:

任何针对 NetCore10 的对象都可以访问 INetStandard15 API NetCore10 特定的 API (比如DotNetHostPolicy).

当然这个库不能用于不同的INetStandard15实现(NetCore10不能转换为NetFramework462Mono46)。

如果您只需要访问 INetStandard15 API(并针对该规范而不是具体框架),您的库可能会被 any framework which implements it 使用(NetCore10NetFramework462, 等等)

注意: 在最初的类比中,David Fowler 使用了 .NET Standard 版本和框架实现的接口。我相信使用接口和 类 相反,更直观,更好地表示规范和具体实现之间的关系。

.NET Core Class 库基本上是 .NET Framework 库的子集,只是包含的 API 较少。坚持使用 .NET Core Class 库使得很难在 运行 次之间共享代码。此代码可能不适用于不同的 运行 时间(Xamarin 的 Mono),因为它没有您需要的 API。要解决这个问题,有 .NET 标准,它只是一组规范,告诉您可以使用哪些 API。 .NET Standard 的主要目的是在 运行 次之间共享代码。重要的是,所有 运行 次都执行此规范。 (.NET Framework、.NET Core 和 Xamarin 的 Mono)。

因此,如果您确定您的库仅用于 .NET Core 项目,您可以忽略 .NET Standard,但如果您的代码有极小的机会被 .NET Framework 或 Mono 使用对于 Xamarin,最好坚持使用 .NET Standard

另请注意,更高版本的 .NET Standard 包含更多 API,但更多平台支持更低版本。 因此,如果您创建了一个要在 运行 次之间共享的 .NET Standard 库,则可以将目标定为最低版本,这有助于您覆盖最多的平台。例如,如果你想在 .NET Framework 4.5 和 .NET Core 1.0 上 运行,你可以使用的最高 .NET Standard 版本是 .NET Standard 1.1。有关详细信息,请参阅 this great table from the documentation

PS:此外,如果您想将库转换为 .NET Standard,.NET 可移植性分析器可以帮助您。

.NET Standard is a specification of APIs that all .NET implementations must provide. It brings consistency to the .NET family and enables you to build libraries you can use from any .NET implementation. It replaces PCLs for building shared components.

.NET Core is an implementation of the .NET Standard that’s optimized for building console applications, Web apps and cloud services using ASP.NET Core. Its SDK comes with a powerful tooling that in addition to Visual Studio development supports a full command line-based development workflow. You can learn more about them at aka.ms/netstandardfaq and aka.ms/netcore.


上面的内容以及对这个问题中讨论的大部分内容的非常清晰的解释可以在 Microsoft(MSDN - 2017 年 9 月)的以下非常有用的文章中找到:.NET Standard - Demystifying .NET Core and .NET Standard

您是指 .NET Framework 吗?因为.NET标准是一个实现,比如.NET Framework、.NET Core和Xamarin。

我喜欢 .NET Core,因为我们可以在 Linux 上托管它(根据我的经验使用 nginx)。它不同于 .NET 框架,后者只能托管在 IIS 上。在这种情况下,您可以考虑托管预算(因为 windows 服务器对我来说很贵)。

开发环境的角度,.Net core是轻量级的。所以,你可以使用 VSCode, Sublime, for IDE (不仅仅是 visual studio).

.NET Standard 是旨在用于 .NET 实现的 .NET API 规范。这使得能够为所有 .NET 实现定义一组统一的 BCL API。

.NET Core 就是这样一种 .NET Standard 实现。 .NET Framework 是 .NET Standard 的另一种实现。

图片来自.NET Blog

gives you a graphical overview of how each framework evolve with versions. Take a look at below diagram from Microsoft Docs.

Targeting .NET Standard increases your platform support whereas targeting a particular .NET platform such as .NET Core (or .NET Framework) will allow you to use all the platform features for that platform.

简单来说,.NET 标准用于编写 class 编译为 dll 的库项目。 .NET Core 可用于开发可在所有操作系统(Windows、Linux、MacOS)上 运行 的实际 Web 应用程序。 (在 .NET Core 3 中,微软已经提供了使用 WPF 开发桌面应用程序的功能,但到目前为止,这些应用程序不会跨平台,并且只能在 windows 系统上 运行 。未来微软可能会制作它们跨平台).NET 标准 libraries/dlls 可用于任何使用 .NET(.NET 框架、.NET 核心)的应用程序,这意味着您可以将 .NET 标准与 .NET 框架和 .NET 核心一起使用.