首页 文章

.NET Standard与.NET Core

提问于
浏览
185

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

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

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

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

6 回答

  • 149

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

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

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

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

    NET Standard Interfaces analogy

    任何目标 NetCore10 都可以访问 INetStandard15 API和 NetCore10 specific API(例如 DotNetHostPolicy ) .

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

    相反,如果您只需要访问 INetStandard15 API(并且针对该规范而不是具体框架),any framework which implements itNetCore10NetFramework462 等)可能会使用您的库 .

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

  • 3

    .NET Core是.NET Standard的一个实现 . 它's available on multiple operating systems, but that'不是一回事 - 还有.NET Standard的其他实现 .

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

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

  • -7

    .NET Core类库基本上是.NET Framework库的子集,它只包含较少的API . 坚持使用.NET Core类库很难在运行时之间共享代码 . 此代码可能不适用于不同的运行时(Mono for Xamarin),因为它没有您需要的API . 为了解决这个问题,有 .NET Standard, which is just set of specification that tells you which APIs you can use . .NET Standard的主要目的是在运行时之间共享代码 . 并且重要的是,此规范由所有运行时实现 . ( . NET Framework, .NET Core 和Mono for Xamarin) .

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

    另请注意,更高版本的.NET Standard包含更多API,但更多平台支持更低版本 . Therefore if you create .NET Standard library that you want to share between runtimes then target the lowest version you can ,可帮助您达到最大数量的平台 . 例如,如果要在.NET Framework 4.5和.NET Core 1.0上运行,则可以使用的最高.NET标准版本是.NET Standard 1.1 . 这个this great table from documentation了解更多信息 .

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

  • 2

    .NET Standard是所有.NET实现必须提供的API规范 . 它为.NET系列带来了一致性,使您能够构建可以从任何.NET实现中使用的库 . 它取代了用于构建共享组件的PCL . .NET Core是.NET标准的一种实现,它针对使用ASP.NET Core构建控制台应用程序,Web应用程序和 Cloud 服务进行了优化 . 它的SDK附带了一个功能强大的工具,除了Visual Studio开发支持完整的基于命令行的开发工作流程 . 您可以在aka.ms/netstandardfaq和aka.ms/netcore上了解有关它们的更多信息 .


    以上,以及对此问题中讨论的大多数内容的非常明确的解释,可以在Microsoft的以下非常有用的文章中找到(MSDN - 2017年9月):.NET Standard - Demystifying .NET Core and .NET Standard

  • 149

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

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

    development environment perspective 中,.Net核心是轻量级的 . 因此,你可以使用VSCode,Sublime,用于IDE(不仅仅是visual studio) .

  • 0

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

    如果您需要或需要跨平台GUI应用程序,那么您需要一个GTK GUI . 这在Linux和Windows下运行 . 您可以使用MonoDevelop来完成此操作 . 现在这种旧方法的唯一区别是,它们不是背后的版本 .

相关问题