.NET标准与.NET核心

我已经阅读了.NET标准和.NET Core之间的区别,但是我真的不知道区别是什么,或者什么时候select.NET标准库项目以及何时select.NET Core库项目。

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

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

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

我会尝试进一步澄清你的疑惑,并延长Jon Skeet的答案。

.NET标准是一个规范 ,所以为特定的.NET标准版本编译的库可以在不同的.NET标准实现中使用。

正如我的另一条评论所说,.NET标准和其他.NET标准实现(.NET Core,.NET Framework等)之间的关系的一个很好的类比是David Fowler的要求 :.NET标准版本是Interfaces ,而框架是这些接口的实现。

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

NET标准接口比喻

任何针对NetCore10东西都可以访问INetStandard15 API NetCore10 特定的 API(如DotNetHostPolicy )。

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

如果你只需要访问INetStandard15 APIs(并且定位该规范而不是一个具体的框架),那么你的库可以被任何实现它的框架 ( NetCore10NetFramework462等等)使用。

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

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

所以,如果你创build一个.NET Core库,它将能够访问在.NET Core中实现的东西,但不是 .NET标准的一部分,而且你的库也不会与.NET Standard的其他实现兼容,如Xamarin,Tizen,完整的.NET桌面框架等。

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

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

因此,如果您确定只将.NET库用于.NET Core项目,则可以忽略.NET Standard,但是如果您的代码被.NET Framework或Mono用于Xamarin的机会甚至很小,那么更好地坚持.NET标准

另请注意,.NET标准的更高版本包含更多的API,但更多的平台支持更低的版本。 因此,如果您创build要在运行时间之间共享的.NET标准库,则可以定位最低版本 ,从而帮助您达到最大数量的平台。 例如,如果您想要在.NET Framework 4.5和.NET Core 1.0上运行,则可以使用的最高.NET标准版本是.NET Standard 1.1。 这个从文档更好的信息这个伟大的表 。

PS:另外如果你想将你的库转换为.NET标准,.NET可移植性分析器可以帮助你。

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

.NET Core是一个.NET标准的实现,它被优化用于使用ASP.NET Core构build控制台应用程序,Web应用程序和云服务。 它的SDK附带了一个强大的工具,除了Visual Studio开发支持完整的基于命令行的开发工作stream程。 你可以在aka.ms/netstandardfaq和aka.ms/netcore上了解更多。


上面,以及对这个问题中讨论的大多数东西的非常清晰的解释可以在微软(MSDN – 2017年9月)的以下非常有帮助的文章中find: .NET标准 – parsing.NET核心和.NET标准

.NET Core没有任何GUI框架。 Windows窗体和WPF仅限于Microsoft Windows平台。

如果你想要或需要跨平台的GUI应用程序,那么你需要一个GTK GUI。 这在Linux和Windows下运行。 你可以通过使用MonoDevelop来做到这一点。 这种老办法现在唯一的区别是,它们不是落后的版本。