【问题标题】:.NET Standard vs .NET Core.NET 标准与 .NET Core
【发布时间】:2017-10-20 11:47:50
【问题描述】:

我读过.NET Standard和.NET Core的区别,但是我真的不知道有什么区别,也不知道什么时候选择.NET Standard库项目,什么时候选择.NET Core库项目.

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

对于 .NET Core,我已经读到它也适用于跨平台使用,所以如果我选择一个 .NET Core 库,我似乎也可以在许多平台上使用它,就像 .NET Standard 一样。

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

【问题讨论】:

  • 用代码术语来说:.net 标准 = 接口,.net 核心 = 类;如果您针对该类进行编码,则不会获得更多方法(等),但是您仅限于该具体类型(和后代);如果您使用接口,您可能会获得更小的表面,但它可以针对任意实现...只要这些实现符合预期:) 是的,.net 核心针对多个平台,但是还有其他 .net 标准的实现
  • .NETStandard 是 PCL 的替代品。可移植类库帮助您编写可以在多个平台(手机、桌面、商店、浏览器、xbox 等)上运行的库。它没有很好地扩展,从 n!问题,所以他们放弃了。 .NETCore 只是他们完成的第一个框架,它是最简单的,其余的必须赶上。请记住,这是非常正在进行中的工作,.NETStandard v2.0 将发生重大变化。统治他们的标准,现在:)
  • 请不要在现有问题上添加额外的问题。您在编辑中的问题与此无关。
  • @JonSkeet 那么我应该提出一个新问题吗?感谢您的建议。因为起初我提出了一个关于 .net Core 多目标的新问题,但我被否决了,因为他们说这是一个重复的问题。
  • @ÁlvaroGarcía:是的,但要说清楚——你当前的单句问题对我来说根本不清楚。

标签: .net .net-core .net-standard


【解决方案1】:

我将尝试进一步澄清您的疑问并扩展 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 标准是一个接口并且可以使用 .net 框架和 .net Core 来实现,那么当我创建一个 .net 标准类库并在另一个项目中使用这个库时,使用的是什么实现,net framework 还是 .net核心?
  • 它将使用已编译应用程序的实现(无论它是什么)。如果您编译 NET 核心应用程序,那么它将使用 NET 核心库(即 NET 标准的实现)
  • 该图在说明核心/标准/框架关系方面非常有用。
  • 因此,如果我创建一个 net461 控制台应用程序并以 netstandard2.0 库为目标,则该标准库中的任何内容都不会在控制台应用程序中解析。所以... ??
  • 一张图抵千言
【解决方案2】:

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

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

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

【讨论】:

  • @ÁlvaroGarcía:“它”应该兼容是什么意思? .NET 核心 1.0?不一定——因为 .NET Core 1.0 仍然可以包含 extra 的东西。该条目意味着,如果您以 .NET Standard 1.6 为目标,则可以在 Mono 4.6 .NET Core 1.0 下运行代码。
  • 您不能在 .NET Core(CoreCLR 和 CoreFX)以外的任何东西上运行 .NET Core 程序集。您可以在满足相关标准(1.3、1.6、2.0 等)的合同义务的任何框架上运行 .NET Standard 程序集。
  • 跨平台是指操作系统,不是框架。
  • 打个比方,试着把 .NET Standard 想象成一个接口(例如INetStandard16)。 .NET Core 1.0 和 Mono 4.6 都实现了INetStandard16。您无法将 .Net Core 1.0 转换为 Mono 4.6(反之亦然),但任何使用 INetStandard16 的东西都可以在两者上使用。 (感谢David Fowler
  • 这让我很吃惊。这些名字似乎倒退了。您会认为名为“核心”的东西会是两者中最小的一个......
【解决方案3】:

.NET Standard 是 .NET API 的规范,旨在用于 .NET 实现。这可以为所有 .NET 实现定义统一的 BCL API 集。

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

图片来自.NET Blog

Federicos answer 为您提供每个框架如何随版本演变的图形概览。请看下图from Microsoft Docs

Targeting .NET Standard 增加了你的 平台支持,同时针对特定的 .NET 平台,例如 .NET Core(或 .NET Framework)将允许您为此使用所有平台功能 平台。

【讨论】:

    【解决方案4】:

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

    因此,如果您确定仅将您的库用于 .NET Core 项目,则可以忽略 .NET Standard,但如果您的代码极有可能被 .NET Framework 或 Mono for 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 Portability Analyzer 可以帮助您。

    【讨论】:

      【解决方案5】:

      .NET Standard 是所有 .NET 实现必须提供的 API 规范。它为 .NET 系列带来了一致性 并使您能够构建可以从任何 .NET 使用的库 执行。它取代了用于构建共享组件的 PCL。

      .NET Core 是 .NET Standard 的实现,针对构建控制台应用程序、Web 应用程序和云进行了优化 使用 ASP.NET Core 的服务。它的 SDK 带有一个强大的工具 除了 Visual Studio 开发还支持完整的命令 基于行的开发工作流程。您可以在以下位置了解有关它们的更多信息 aka.ms/netstandardfaqaka.ms/netcore


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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          您是说 .NET Framework 吗?因为 .NET 标准是一种实现,例如 .NET Framework、.NET Core 和 Xamarin。

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

          开发环境的角度,.Net 核心是轻量级的。因此,您可以将 VSCode、Sublime 用于 IDE(不仅仅是 Visual Studio)。

          【讨论】:

            猜你喜欢
            • 2019-06-20
            • 2016-11-08
            • 1970-01-01
            • 2017-09-18
            • 1970-01-01
            • 2017-03-19
            • 2018-05-12
            • 1970-01-01
            • 2018-03-29
            相关资源
            最近更新 更多