我已经了解了.NET Standard和.NET Core之间的区别,但我真的不知道区别是什么,或者何时选择.NET标准库项目以及何时选择.NET Core库项目
我已经读过.NET标准是为了确保一组API始终可用,无论使用哪个平台(只要该平台与我选择的.NET标准版本兼容)。如果我没弄错的话,这意味着我可以创建一个.NET Standard类库,然后在任何与我选择的.NET Standard版本兼容的平台上使用它。
使用.NET Core,我已经读过它也是为了跨平台使用,所以如果我选择一个.NET Core库,我似乎也可以在很多平台上使用它,就像.NET Standard一样。 / p>
所以最后,我没有看到差异。我什么时候应该使用哪个?他们之间有什么区别?
答案 0 :(得分:164)
我将尝试进一步澄清您的疑虑并延长Jon Skeet的答案。
.NET Standard是规范,因此针对特定.NET Standard版本编译的库可以在不同的.NET Standard实现中使用。
正如我在其他评论中所说,.NET Standard与其他.NET标准实现(.NET Core,.NET Framework等)之间关系的一个很好的类比是this gist by David Fowler:.NET标准版本是{ {1}},而框架是这些接口的实现。
这个简化的图表可能有助于理解这种关系:
任何定位Interfaces
的内容都可以访问NetCore10
API 和 INetStandard15
特定 API(例如NetCore10
)
当然,此库无法在不同的DotNetHostPolicy
实施中使用(INetStandard15
无法转换为NetCore10
或NetFramework462
)。
如果您只需要访问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/netstandardfaq和aka.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的图片
Federicos answer为您提供了每个框架如何随版本发展的图形概述。看看下面的图from Microsoft Docs。
Targeting .NET Standard增加了您的 平台支持,而针对特定的.NET平台,例如 .NET Core(或.NET Framework)将允许您使用所有平台功能 平台。