.NET Core 是 .NET Standard 的“实现”吗?

Posted

技术标签:

【中文标题】.NET Core 是 .NET Standard 的“实现”吗?【英文标题】:Is .NET Core an "Implementation" of .NET Standard? 【发布时间】:2017-06-19 19:42:35 【问题描述】:

我仍然对 .NET Core 和 .NET Standard 之间的关系感到很困惑。

据我了解,.NET Standard 是一个接口定义(与 Katana 是 OWIN 的实现方式没有什么不同)。 .NET Framework 将实现 .NET Standard 的版本。

到目前为止这是否正确?

.NET Core 将其依赖项捆绑在其中。这些依赖项将使用 .NET Standard 接口的实现。这可能是 .NET Framework、Mono 或其他。

ASP Core 是引用了“Web”内容的 .NET Core。几乎只是一个 Visual Studio 模板,因为它可以从 .NET Core 控制台应用程序构建。

我还接近正轨吗?

最后,如果我可以创建一个新的、未开发的应用程序,那么 .NET Core 应该是最受欢迎的技术(假设我不需要任何仅 .NET Framework 的程序集)。

最后一个问题,我可以从 .NET Core 项目中引用 GAC 中的 .NET Framework 程序集吗?

干杯

【问题讨论】:

好问题,我自己仍然对一些部分感到困惑。但是,是的,第一部分是正确的 .NET Standard 是 API 规范,可确保兼容性。 @JanesAbouChleih 那么开始吧。那么.NET Core 是 .NET Standard 的实现吗? 是的,我相信是的。它建立在 .NET 标准之上。例如。 .NET Core 2.0 是基于 .NET Standard 2.0 构建的,以此类推,.NET Core 1.0 是基于 NET Standard 1.6 构建的,以此类推。我认为已经有一个关于这个的问题......搜索。找到它:***.com/questions/44085424/net-standard-vs-net-core “我可以从 .NET Core 项目引用 GAC 中的 .NET Framework 程序集吗?”如果这样做,您的项目实际上不再是 .NET Core,并且可以“仅仅”在 .NET Framework 上运行。所以是的,但不要这样做,因为这从来都不是你真正想做的。 @JeroenMostert 是的,我意识到这会将它绑定到框架。 【参考方案1】:

我的理解是.NET Core 正在实现.NET Standard

所以.NET Standard 更像是一个规范,而.NET Core 是一个实现该规范的实际框架。

.NET Standard 也由其他框架实现,例如 .NET FrameworkXamarin(以及构建在 .NET Core 之上的 ASP.NET Core)。

Here is offficial explanation:

.NET Standard 与 .NET Core 有何不同?

.NET Standard 是涵盖 .NET 平台必须实现哪些 API 的规范。

.NET Core 是一个具体的 .NET 平台,实现了 .NET 标准。

.NET Standard:

.NET 标准是 .NET API 的正式规范,旨在用于所有 .NET 运行时。

各种 .NET 运行时实现特定版本的 .NET Standard。

Introducing .NET Standard:

.NET Standard 是一组所有 .NET 平台都必须实现的 API。这统一了 .NET 平台并防止了未来的碎片化。

.NET Standard 2.0 将由 .NET Framework、.NET Core 和 Xamarin 实现。对于 .NET Core,这将添加许多已请求的现有 API。

Introducing .NET Core:

.NET Core 本质上是 NET Framework 的一个分支

另一种看待它的方式:.NET Framework 基本上有两个分支。一个 fork 由 Microsoft 提供,仅适用于 Windows。另一个分支是 Mono,您可以在 Linux 和 Mac 上使用它。

更多详情请阅读:

.NET Standard FAQ .NET Standard (下表列出了所有.NET Standard 版本和支持的平台) Introducing .NET Standard Introducing .NET Core

【讨论】:

【参考方案2】:
    是的,.NET Core 是一个实现 .NET Standard 版本的平台/运行时。

如果您构建一个面向 .NET Standard 版本的库,则它可以在任何实现此版本或更高版本 .NET Standard 的运行时上使用。这适用于 .NET Core 以及单声道 (=> Xamarin)、UWP (.NET Native) 和 .NET Framework。

    分发的细节并不重要。从技术上讲,.NET Core NETStandard.Library 的构建方式,但 2.0 正在改变。

    ASP.NET Core “只​​是”一组库和工具,位于它需要在其上运行的 .NET Standard 版本(2.0 之前的版本也是 .NET Framework 的版本)之上。这意味着您可以为 .NET Core 和 .NET Framework 构建 ASP.NET Core 应用程序 - 如果它们支持所需的 .NET Standard 级别,甚至可能是其他运行时。

    对于新项目,评估您的需求是有意义的。 .NET Core 具有与 .NET Framework 不同的服务策略,并且 .NET Framework 仍然具有不会包含在 .NET Core 中的组件和 API - 例如 WinForms 和 WPF。

    对于新的库项目,尽可能以 .NET Standard 而非 .NET Framework 为目标是有意义的,以确保在更多类型的项目中的可重用性。

【讨论】:

我没有考虑过服务政策。【参考方案3】:

简单的答案是

.NET Core 实现 .NET 标准库,因此支持 .NET 标准库。

以及基于 .NET Core 构建的 ASP.NET Core。

但是:这并不意味着所有 ASP.NET Core 应用程序都支持 .NET Standard。 ASP.NET Core 应用可以在 .NET Core 或完整的 .NET Framework 上运行。如果应用将完整的 .NET Framework 作为目标平台,则它可能依赖于不支持 .NET Standard 的库。

【讨论】:

【参考方案4】:

其他答案很好,涵盖了如何,但我认为真正理解 .NET Standard 的关键是为什么

.NET Standard 的实际用途是什么?

.NET Standard 的目的是允许开发人员编写他们的库和通用代码,以便他们编写的任何应用程序都可以使用它,无论使用该代码的应用程序针对哪个平台(网络、桌面、移动设备、服务等)。

这是必需的,因为 .NET 已经分叉并演变成多种风格(主要是完整的 .NET Framework、.NET Core 和 Xamarin)。目前,如果你想写一些代码,例如封装一些关键业务逻辑,然后在桌面应用程序、移动应用程序和网站上都使用该代码,那么这是很难实现的。

一次编写,随处运行

.NET Standard 的理念是,如果您编写代码仅针对 .NET Standard 中的 API,那么它应该可以在任何安装了实现 .NET Standard 的 .NET 版本的平台上运行。

您不必在 .NET Standard 中编写整个应用程序,因为您仍然需要平台或 .NET 版本的特定功能(例如 Windows 窗体控件库、Xamarin 窗体控件、文件系统访问、Web 安全等) ,但是如果你编写你的库代码以 .NET Standard 为目标,你就会知道它可以很容易地在不同平台上的不同应用程序之间共享,并且如果它们安装了 .NET Standard 实现版本的 .NET,它应该可以在这些平台上工作.

[“我们为什么需要一个标准?” Immo Landewerth 的此 MSDN 博客部分][1] 很好地涵盖了这一点。

【讨论】:

以上是关于.NET Core 是 .NET Standard 的“实现”吗?的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core、Portable、Standard、Compact、UWP 和 PCL 之间的区别?

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

针对 .NET Core 与 .NET Standard

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

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

.net Core 多目标和 .net Standard 有啥区别?