.NET Standard与.NET Core

时间:2017-05-20 11:38:55

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

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

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

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

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

7 个答案:

答案 0 :(得分:164)

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

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

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

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

NET Standard Interfaces analogy

任何定位Interfaces的内容都可以访问NetCore10 API INetStandard15 特定 API(例如NetCore10

当然,此库无法在不同的DotNetHostPolicy实施中使用(INetStandard15无法转换为NetCore10NetFramework462)。

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

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

答案 1 :(得分:163)

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

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

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

答案 2 :(得分:4)

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

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

另请注意,更高版本的.NET Standard包含更多API,但更多平台支持更低版本。 因此,如果您要创建要在运行时间之间共享的.NET标准库,请定位最低版本,这有助于您达到最大数量的平台。例如,如果要在.NET Framework 4.5和.NET Core 1.0上运行,则可以使用的最高.NET标准版本是.NET Standard 1.1。这个this great table from documentation有关它的更多信息。

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

答案 3 :(得分:2)

  

.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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

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

开发环境透视中,.Net核心是轻量级的。因此,您可以使用VSCode,Sublime for IDE(不仅仅是visual studio)。

答案 6 :(得分:0)

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

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

来自.NET Blog的图片

enter image description here

Federicos answer为您提供了每个框架如何随版本发展的图形概述。看看下面的图from Microsoft Docs

enter image description here

  

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