.NET Standard与.NET Core

Álv*_*cía 219 .net .net-core .net-standard

我已经了解了.NET Standard和.NET Core之间的区别,但我真的不知道区别是什么,或者何时选择.NET标准库项目以及何时选择.NET Core库项目.

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

使用.NET Core,我已经读过它也是为了跨平台使用,所以如果我选择一个.NET Core库,我似乎也可以在许多平台上使用它,就像.NET Standard一样.

所以最后,我没有看到差异.我什么时候应该使用哪个?他们之间有什么区别?

Fed*_*uma 177

我将尝试进一步澄清您的疑虑,并延长Jon Skeet的答案.

.NET Standard是一个规范,因此为特定.NET Standard版本编译的库可以在不同的.NET Standard实现中使用.

正如我在其他评论中所说的那样,对于.NET标准与其他.NET标准实现(.NET Core,.NET Framework等)之间关系的一个很好的类比是David Fowler的这个要点:.NET标准版本是Interfaces,而框架是这些接口的实现.

这个简化的图表可能有助于理解这种关系:

NET标准接口类比

任何目标NetCore10都可以访问INetStandard15API NetCore10 特定的 API(例如DotNetHostPolicy).

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

如果,相反,只需要访问INetStandard15的API(和目标是规范,而不是一个具体的框架),您的库可以通过使用任何一个实现它的框架(NetCore10,NetFramework462,等)

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

  • 它将使用已编译应用程序的实现(无论它是什么).如果你编译一个.NET核心应用程序,那么它将使用.NET核心库(这是一个NET标准的实现) (7认同)
  • 该图表非常有助于说明核心/标准/框架关系. (4认同)
  • 非常感谢你.但我怀疑.如果.net标准是一个接口,可以用.net框架和.net Core实现,当我创建.net标准类库并在另一个项目中使用这个库时,使用什么实现,net framework或.net核心? (2认同)
  • 一张图片胜过千言万语 (2认同)

Jon*_*eet 173

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

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

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

  • 作为类比,尝试将.NET Standard想象为一个接口(例如`INetStandard16`)..NET Core 1.0和Mono 4.6都实现了`INetStandard16`.你不能将.Net Core 1.0转换为Mono 4.6(反之亦然),但任何使用`INetStandard16`的东西都可以兼用.(归功于[David Fowler](https://gist.github.com/davidfowl/8939f305567e1755412d6dc0b8baf1b7)) (15认同)
  • @ÁlvaroGarcía:你说"它"应该兼容是什么意思?.NET Core 1.0?不一定 - 因为.NET Core 1.0仍然可以包含*extra*的东西.该条目意味着如果您以.NET Standard 1.6为目标,则可以在Mono 4.6*和*.NET Core 1.0下运行代码. (5认同)
  • 除了.NET Core(CoreCLR和CoreFX)之外,您无法运行.NET Core程序集.您可以在满足相关标准(1.3,1.6,2.0等)的合同义务的任何框架上运行.NET标准程序集. (4认同)
  • 这让我感到惊讶.名字似乎倒退了.您会认为名为"核心"的东西将是两者中最小的... (4认同)
  • 跨平台是指操作系统,而不是框架。 (2认同)
  • 我在想熵已经开始了. (2认同)

Nip*_*una 9

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

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

图片来自.NET 博客

在此处输入图片说明

Federicos 的回答为您提供了每个框架如何随版本演变的图形概述。看看下面来自 Microsoft Docs 的图表。

在此处输入图片说明

针对.NET标准增加你的平台支持,而针对某一特定.NET平台,如.NET核心(或.NET框架)将允许您使用所有平台功能该平台。


use*_*704 6

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

因此,如果您确定您的库仅用于 .NET Core 项目,则可以忽略 .NET Standard,但如果您的代码被 .NET Framework 或 Mono for Xamarin 使用的可能性甚至很小,那么最好坚持 .NET 标准

另请注意,更高版本的 .NET Standard 包含更多 API,但更多平台支持更低版本。因此,如果您创建了一个想要在运行时之间共享的 .NET Standard 库,那么请尽可能以最低版本为目标,这有助于您覆盖最多的平台。例如,如果要在 .NET Framework 4.5 和 .NET Core 1.0 上运行,则可以使用的最高 .NET Standard 版本是 .NET Standard 1.1。有关它的更多信息,请参阅文档中的这个很棒的表格

PS:此外,如果您想将库转换为 .NET Standard,.NET Portability Analyzer 可以帮助您。