.NET Standard与.NET Core


240

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

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

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

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


33
用代码术语:.net标准=接口,.net核心=类;如果您针对该类进行编码,则您可能会获得更多方法(等),但仅限于该具体类型(和后代);如果您使用该接口,则表面可能会更小,但是它将可用于任意实现...只要这些实现能够达到预期的效果:)是的,.net core针对多个平台,但是.net 还有其他实现标准
Marc Gravell

9
.NETStandard是PCL的替代品。可移植类库可帮助您编写可在多个平台(电话,台式机,商店,浏览器,xbox等)上运行的库。它的伸缩性不是很好,遭受了n的严重折磨!问题,所以他们放弃了。.NETCore只是他们完成的第一个框架,这是最简单的,其余的必须赶上。请记住,这是一个非常大的工作,.NETStandard v2.0即将进行重大更改。
暂时

请不要在现有问题上添加其他问题。您在编辑中的问题与此分开。
乔恩·斯基特

1
@JonSkeet然后我应该打开一个新问题?感谢您的建议。因为起初我打开了一个有关.net Core多目标的新建议,而我被拒绝了,因为他们说这是一个重复的问题。
阿尔瓦罗·加西亚

@ÁlvaroGarcía:是的,但请说清楚-您目前的一句话问题对我来说根本不清楚。
乔恩·斯基特

Answers:


194

我将尝试进一步澄清您的疑问并扩展乔恩·斯基特的回答。

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

正如我在其他评论中所述,David Fowler的主旨是对.NET Standard和其他.NET Standard实现(.NET Core,.NET Framework等)之间关系的一个很好的类比:.NET Standard版本是Interfaces,而Framework是这些接口的实现。

此简化图可能有助于理解这种关系:

NET标准接口类比

任何目标定位NetCore10都可以访问INetStandard15 API NetCore10 特定的 API(例如DotNetHostPolicy)。

当然,该库不能用于不同的INetStandard15实现中(NetCore10不能转换为NetFramework462Mono46)。

相反,如果您只需要访问INetStandard15API(并且针对该规范而不是具体框架),则您的库可能会被任何人框架,实现它NetCore10NetFramework462,等)

注意:在最初的类比中,David Fowler使用了.NET Standard版本和框架实现的接口。我认为,使用接口和类可以更直观,并且可以更好地表示规范和具体实现之间的关系。


2
非常感谢。但是我有一个疑问。如果.net标准是一个接口,并且可以用例如.net框架和.net Core来实现,那么当我创建.net标准类库并在另一个项目中使用该库时,正在使用什么实现,net框架或.net核心?
阿尔瓦罗·加西亚

8
它将使用已编译应用程序的实现(无论它是什么)。如果您编译NET核心应用程序,则它将使用NET核心库(这是NET标准的实现)
Federico Dipuma

5
该图对于说明核心/标准/框架关系非常有用。
贾斯珀

因此,如果我创建一个net461控制台应用程序并以netstandard2.0库作为目标,则该标准库中的任何内容都无法在控制台应用程序中解析。所以... ??
Sinaesthetic

2
一幅图片值得一千个单词
Nikaas

182

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

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

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


5
@ÁlvaroGarcía:“兼容”是什么意思?.NET Core 1.0?不一定-因为.NET 1.0的核心仍然可以包括额外的东西。该条目意味着,如果您以.NET Standard 1.6为目标,则可以在Mono 4.6 .NET Core 1.0 下运行代码。
乔恩·斯基特

4
除了.NET Core(CoreCLR和CoreFX)以外,您不能在任何其他版本上运行.NET Core程序集。您可以在满足相关标准(1.3、1.6、2.0等)的合同义务的任何框架上运行.NET Standard程序集。
马克·雷德尔

2
跨平台是指操作系统,而不是框架。
马克·雷德尔

15
作为类比,请尝试将.NET Standard作为接口(例如INetStandard16)。.NET Core 1.0和Mono 4.6都实现了INetStandard16。您不能将.Net Core 1.0转换为Mono 4.6(反之亦然),但是任何使用的东西INetStandard16都可以在两者上使用。(鸣谢David Fowler
Federico Dipuma

6
这让我感到惊讶。名称似乎倒退。您可能会认为名为“核心”的东西会是两者中最小的……
jpmc26

6

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

因此,如果您确定只将库用于.NET Core项目,则可以忽略.NET Standard,但是,即使极少数机会将您的代码由.NET Framework或Mono用于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可移植性分析器也可以帮助您。


4

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

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

.NET博客的图片

在此处输入图片说明

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

在此处输入图片说明

.NET Standard为目标可以增加对平台的支持,而以.NET Core(或.NET Framework)等特定的.NET平台为目标,则可以使用该平台的所有平台功能。


2

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

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


上面的内容以及对该问题所讨论的大多数内容的非常清楚的解释,可以在Microsoft(MSDN-2017年9月)的以下非常有用的文章中找到:.NET Standard-使.NET Core和.NET Standard脱神秘


0

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

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

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


0

简而言之,.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一起使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.