.NET Core和.NET标准类库项目类型有什么区别?

Gig*_*igi 729 .net class-library .net-core .net-standard

在Visual Studio中,您可以创建至少3种不同类型的类库:

  • 类库(.NET Framework)
  • 类库(.NET标准)
  • 类库(.NET Core)

虽然第一个是我们多年来一直使用的,但我遇到的一个主要问题是何时使用.NET Standard和.NET Core类库类型.最近,当我尝试多目标不同的框架版本创建一个单元测试项目时,我一直被这种做法所困扰.

那么,类库(.NET标准版)类库(.NET Core)之间有什么区别,为什么两者都存在,什么时候应该使用另一个呢?

Sha*_*tin 539

我们什么时候应该使用另一个?

该决定是兼容性和API访问之间的权衡.

如果要增加与库兼容的应用程序数量,请使用.NET标准库,并且可以减少库可以访问的.NET API表面区域.

如果要增加库可以访问的.NET API表面区域,请使用.NET Core库,并且只允许.NET Core应用程序与库兼容即可.

例如,面向.NET Standard 1.3的库将与面向.NET Framework 4.6,.NET Core 1.0,Universal Windows Platform 10.0以及支持.NET Standard 1.3的任何其他平台的应用程序兼容.但是,该库无法访问.NET API的某些部分.例如,该 Microsoft.NETCore.CoreCLR软件包与.NET Core兼容,但与.NET Standard不兼容.

类库(.NET标准)和类库(.NET Core)之间有什么区别?

基于包的框架部分描述了差异.

兼容性:面向.NET Standard的库将在任何符合.NET标准的运行时上运行,例如.NET Core,.NET Framework,Mono/Xamarin.另一方面,面向.NET Core的库只能在.NET Core运行时上运行.

API表面区域:.NET标准库包含所有内容,NETStandard.Library而.NET Core库随附所有内容Microsoft.NETCore.App.后者包括大约20个额外的库,其中一些我们可以手动添加到我们的.NET标准库(例如System.Threading.Thread),其中一些与.NET标准(例如Microsoft.NETCore.CoreCLR)不兼容.

此外,.NET Core库指定运行时并附带应用程序模型.例如,重要的是使单元测试类库可运行.

为什么两者都存在?

暂时忽略库,.NET Standard存在的原因是可移植性; 它定义了.NET平台同意实现的一组API.任何实现.NET标准的平台都与面向.NET标准的库兼容.其中一个兼容的平台是.NET Core.

回到库,.NET标准库模板可以在多个运行时上运行(以API表面区域为代价).相反,.NET Core库模板用于访问更多API表面区域(以兼容性为代价)并指定用于构建可执行文件的平台.

  • [此图](https://social.msdn.microsoft.com/Forums/getfile/981310)确实帮助了我。 (5认同)
  • 我已经更新了我对链接问题的答案.TL; DR; 过去,类库以完整框架为目标,包括应用程序模型. (3认同)
  • 很好的答案。不过,还有一个问题(与[这个问题]有关(http://stackoverflow.com/questions/42938879/cant-get-xunit-tests-to-run-with-net-core/42942592#42942592):为什么是应用程序模型是运行单元测试所必需的吗?过去从来没有这样,当我们使用不可运行的类库来保存单元测试的集合时。 (2认同)

use*_*426 369

对.NET核心类库是在内置的.Net标准.如果要实现可移植到.Net Framework的库,.Net CoreXamarin,选择.Net标准库

.Net Core最终将实施.Net Standard 2(Xamarin.Net Framework也将如此)

达网络核心,Xamarin.Net框架可以,因此也被认定为调味剂.NET标准

为了使您的代码共享和重用应用程序能够面向未来,您宁愿实现.Net标准库.

Microsoft还建议您使用.NET Standard而不是Portable Class Libraries.

引用MSDN作为权威来源,.Net标准旨在成为统一所有的一个图书馆.由于图片胜过千言万语,以下内容将使事情变得非常明确:

1.您当前的应用场景(碎片化)

像我们大多数人一样,您可能处于以下情况:(.NET Framework,Xamarin和现在.Net Core风格的应用程序)

在此输入图像描述

2. .Net标准库将为您启用什么(跨框架兼容性)

实现.Net标准库允许跨所有这些不同风格的代码共享:

一个图书馆统治它们

对于不耐烦:

  1. .NET Standard通过在您需要的环境中引入您期望和喜爱的所有API,解决了所有平台上.NET开发人员的代码共享问题:桌面应用程序,移动应用程序和游戏以及云服务:
  2. .NET标准是一组API,所有的 .NET平台必须实现.这统一了.NET平台防止了未来的碎片.
  3. .NET Standard 2.0将由.NET Framework实现.NET CoreXamarin.对于.NET Core,这将添加许多已请求的现有API.
  4. .NET Standard 2.0包含.NET Framework二进制文件的兼容性填充程序,显着增加了可以从.NET标准库引用的库集.
  5. .NET Standard 将取代可移植类库(PCL)作为构建多平台.NET库的工具故事.

有关一个表,以帮助了解您可以根据您打算运行的.NET平台来定义最高版本的.NET Standard,请转到此处.

资料来源:MSDN:介绍.Net标准版

  • 我不是在谈论组合.NET Core和.NET Framework.我的观点是ASP.NET Core完全不依赖于.NET Core,尽管名称如此.它被编写为面向.NET Standard的库,因此您可以在任何可以使用.NET Standard的地方使用它.是的,他们在那张照片上犯了一个错误. (3认同)
  • ASP.NET Core在该图形中有点错位,因为它可以与完整的.NET Framework一起使用,而不仅仅是.NET Core,因为它实际上是针对.NET Standard. (2认同)
  • 但是您可以使用完整的.NET Framework创建ASP.NET Core应用程序 - ASP.NET Core实际上属于与.NET Standard相同的层.它不仅限于.NET Core. (2认同)
  • @OgrishMan **您无法在.Net Standard中创建可执行文件**。它只能是一个类库,其他执行代码可以引用该类库。**它没有运行时间**。 (2认同)

小智 82

所以简短的回答是:

IAnimal == .NetStandard (General)
ICat == .NetCore (Less General)
IDog == .NetFramework (Specific / oldest and has the most features)
Run Code Online (Sandbox Code Playgroud)

  • @ Joe.wang我认为它很糟糕,它混淆了.NET Core和.NET Framework之间的关系.如果.NET Core是鸟,那么.NET Framework就不可能是老鹰(也许猫更适合). (26认同)
  • @LexLi是对的,这混淆了水域..NET Framework不是.NET Core的子类型. (8认同)
  • 这可能看起来有点花哨而不是精确 (6认同)
  • 狗比猫有更多功能?Nop :) (4认同)
  • @Joe的原始评论听起来更准确.社区编辑的回答令人困惑 (3认同)
  • 这是错误的.net核心与.net框架不兼容 (2认同)

Joe*_*orn 68

.Net Framework.Net Core是.Net运行时的两种不同实现.Core和Framework(尤其是Framework)都有不同的配置文件,包括Microsoft为.Net创建的许多API和程序集的更大或更小(或只是简单的不同)选择,具体取决于它们的安装位置和配置文件.例如,通用Windows应用程序中提供的某些API与"普通"Windows配置文件中的API不同.即使在Windows上,您也可能拥有"客户端"配置文件与"完整"配置文件.此外,还有其他实现(如Mono)具有自己的库集.

.Net Standard是一组规范,其中必须提供API库和程序集.为.Net Standard 1.0编写的应用程序应该能够编译和运行任何版本的Framework,Core,Mono等,它们宣传对.Net Standard 1.0库集合的支持.类似于.Net Standard 1.1,1.5,1.6,2.0等.只要运行时提供对程序所针对的Standard版本的支持,您的程序就应该在那里运行.

针对标准版本的项目将无法使用该标准修订版中未包含的功能.这并不意味着您不能依赖于其他供应商发布的其他程序集或API(即:NuGet上的项目).但它确实意味着您所采用的任何依赖项还必须包括对您的.Net Standard版本的支持..Net标准正在快速发展,但它仍然足够新,并且对一些较小的运行时配置文件足够关注,这种限制可能让人感到窒息.(注意一年半之后:这种情况开始发生变化,最近的.Net标准版本更加出色,功能更全面).

另一方面,针对Standard的应用程序应该能够在更多部署情况下使用,因为理论上它可以与Core,Framework,Mono等一起运行.对于寻求广泛分发的类库项目,这是一个有吸引力的承诺.对于主要用于内部目的的类库项目,它可能不是一个问题.

.Net标准也适用于SysAdmin团队由于哲学或成本原因而希望从Windows上的ASP.Net迁移到Linux上的.Net Core的ASP.Net的情况,但开发团队希望继续反对.Net Windows上Visual Studio中的框架.

  • 如果这是你的目标,那么这个问题需要被关闭为"不清楚你在问什么",因为总会有太多的情境细节发挥到特定的人的环境,让我们永远告诉你该怎么做如果您询问一般情况,或者"太宽泛".我们在这里所做的就是为您提供有关产品的信息,以便您了解自己的决定. (6认同)

bsi*_*ide 27

.NET Framework和.NET Core都是框架.

.NET Standard是标准的(换句话说,规范).

您可以使用.NET Framework和.NET Core制作可执行项目(如Console应用程序或ASP.NET应用程序),但不能使用.NET Standard.

使用.NET Standard,您只能创建无法独立执行的类库项目,并且应该由另一个.NET Core或.NET Framework可执行项目引用.


Mah*_*man 16

希望这有助于理解.NET Standard API表面与其他.NET平台之间关系.每个接口代表一个目标框架,方法代表该目标框架上可用的API组.

namespace Analogy
{
  // .NET Standard

interface INetStandard10
{
    void Primitives();
    void Reflection();
    void Tasks();
    void Xml();
    void Collections();
    void Linq();
}

interface INetStandard11 : INetStandard10
{
    void ConcurrentCollections();
    void LinqParallel();
    void Compression();
    void HttpClient();
}

interface INetStandard12 : INetStandard11
{
    void ThreadingTimer();
}

interface INetStandard13 : INetStandard12
{
    //.NET Standard 1.3 specific APIs
}

// And so on ...


// .NET Framework 

interface INetFramework45 : INetStandard11
{
    void FileSystem();
    void Console();
    void ThreadPool();
    void Crypto();
    void WebSockets();
    void Process();
    void Drawing();
    void SystemWeb();
    void WPF();
    void WindowsForms();
    void WCF();
}

interface INetFramework451 : INetFramework45, INetStandard12
{
    // .NET Framework 4.5.1 specific APIs
}

interface INetFramework452 : INetFramework451, INetStandard12
{
    // .NET Framework 4.5.2 specific APIs
}

interface INetFramework46 : INetFramework452, INetStandard13
{
    // .NET Framework 4.6 specific APIs
}

interface INetFramework461 : INetFramework46, INetStandard14
{
    // .NET Framework 4.6.1 specific APIs
}

interface INetFramework462 : INetFramework461, INetStandard15
{
    // .NET Framework 4.6.2 specific APIs
}

// .NET Core
interface INetCoreApp10 : INetStandard15
{
    // TODO: .NET Core 1.0 specific APIs
}
// Windows Universal Platform
interface IWindowsUniversalPlatform : INetStandard13
{
    void GPS();
    void Xaml();
}

// Xamarin 
interface IXamarinIOS : INetStandard15
{
    void AppleAPIs();
}

interface IXamarinAndroid : INetStandard15
{
    void GoogleAPIs();
}    
// Future platform

interface ISomeFuturePlatform : INetStandard13
{
    // A future platform chooses to implement a specific .NET Standard version.
    // All libraries that target that version are instantly compatible with this new
    // platform
}
}
Run Code Online (Sandbox Code Playgroud)

资源


Dev*_*vin 13

解释差异的另一种方法可能是在现实世界中的示例,因为我们大多数人都将使用现有工具和框架(Xamarin,Unity等)来完成这项工作。

因此,使用.NET Framework,您可以使用所有.NET工具,但只能针对Windows应用程序(UWP,Winforms,ASP.NET等)。由于.NET Framework是封闭源代码,因此无需太多处理。

使用.NET Core,您拥有较少的工具,但是您可以针对主要的桌面平台(Windows,Linux,Mac)。这在ASP.NET Core应用程序中特别有用,因为您现在可以在Linux中托管Asp.net(便宜的托管价格)。现在,由于.NET Core是开源的,因此在技术上可以为其他平台开发库。但是由于没有支持它的框架,所以我认为这不是一个好主意。

使用.NET Standard,您拥有甚至更少的工具,但您可以针对所有/大多数平台。您可以通过Xamarin来定位Mobile,甚至可以通过Mono / Unity来定位游戏机。

在实际的应用程序中,您可能需要使用所有这些。例如,我开发了具有以下架构的销售点应用程序:

共享服务器和客户端:

  • 处理我的应用程序模型的.NET标准库。

由于它是.NET标准库,因此可以在任何其他库中使用。

服务器端(Web API):

  • 处理所有数据库连接的.NET Standard(也可以是Core)库。

  • 一个处理Rest API并使用数据库库的.NET Core项目。

由于它是在.NET Core中开发的,因此我可以将应用程序托管在Linux服务器上。

客户端(带有WPF + Xamarin.Forms Android / IOS的​​MVVM):

  • 一个处理客户端API连接的.NET Standard库。

  • 一个处理ViewModels逻辑的.NET标准库。在所有视图中使用。

  • .NET Framework WPF应用程序,用于处理Windows应用程序的WPF视图。

  • 一个处理Xamarin Forms视图的.NET标准库。

  • Xamarin Android和Xamarin IOS项目。

因此,您可以看到应用程序的客户端具有很大的优势,因为我可以重用.NET标准库(客户端API和ViewModels),并且只需为WPF,Xamarin和IOS应用程序创建没有逻辑的视图。

  • 我认为这是一个更好的答案,因为它包含了真实世界。 (2认同)

syd*_*ydd 10

.NET标准:将其视为一个大型标准库.当使用它作为依赖项时,您只能创建库(.DLL),而不是可执行文件.使用.NET标准作为依赖项创建的库可以添加到Xamarin.Android,Xamarin.iOS,.NET Core Windows/OSX/Linux项目中.

.NET Core:将它视为旧.NET框架的延续,只是它的开源,有些东西尚未实现,而其他东西已被弃用.它扩展了.NET标准的附加功能,但只能在桌面上运行.将此作为依赖项添加时,您可以在Windows,Linux和OSX上创建可运行的应用程序.(虽然现在只有控制台,没有GUI).所以.NET Core = .NET Standard + Desktop特定的东西.
UWP也使用它,新的ASP.NET核心也将它用作依赖.


小智 8

.Net标准主要用于改进代码共享,并使每个.Net实现中的API更加一致.

在创建库时,我们可以定位as.Net Standard 2.0,这样创建的库就可以与不同版本的.Net Framework兼容,包括.Net Core,Mono ..