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

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

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

虽然第一个是我们多年来一直在使用的,但我一直困惑的一个主要问题是何时使用. NET Standard和. NET Core类库类型。我最近在尝试多目标不同框架版本创建单元测试项目时被这个咬了一口。

那么,类库(. NET标准)类库(. NET Core)有什么区别,为什么两者都存在,什么时候我们应该使用一个而不是另一个?

225720 次浏览

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

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

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

当您想要增加您的库可以访问的. NET API表面积时,请使用. NET Core库,并且您可以只允许. NET Core应用程序与您的库兼容。

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

类库(. NET Standard)和类库(. NET Core)有什么区别?

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

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

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

为什么两者都存在?

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

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

这是一个交互式矩阵,显示哪个. NET Standard支持哪个. NET实现以及可用的API表面积。

. NET. NET Core是. NET运行时的两种不同实现。Core和Framework(尤其是Framework)都有不同的配置文件,其中包括Microsoft为. NET创建的许多API和程序集的较大或较小(或完全不同)的选择,具体取决于它们的安装位置和配置文件。

例如,通用Windows应用程序中的API与“普通”Windows配置文件中的API不同。即使在Windows上,您也可能拥有“客户端”配置文件与“完整”配置文件。此外,还有其他实现(如Mono)拥有自己的库集。

. NET标准是一组API库和程序集必须可用的规范。为. NET Standard 1.0编写的应用程序应该能够使用任何版本的Framework、Core、Mono等编译和运行,这些版本宣传支持. NET Standard 1.0库集合。. NET Standard 1.1、1.5、1.6、2.0等也是如此。只要运行时为您的程序所针对的Standard版本提供支持,您的程序就应该在那里运行。

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

另一方面,针对Standard应该的应用程序能够在更多的部署情况下使用,因为理论上它可以与Core、Framework、Mono等一起运行。对于一个寻求广泛分发的类库项目,这是一个有吸引力的承诺。对于主要面向内部受众的以最终用户为中心的项目,这可能不是那么令人担忧。

. NET Standard在系统管理员团队出于哲学或成本原因希望从Windows上的ASP.NET转移到Linux上的. NET CoreASP.NET的情况下也很有用,但开发团队希望继续在Windows上的Visual Studio中使用. NET Framework。

简短的回答是:

IAnimal == .NetStandard (General)ICat == .NetCore (Less general)IDog == .NetFramework (Specific / oldest and has the most features)

. NET核心类库建立在. NET标准之上。如果您想实现一个可移植到. NET Framework. NET CoreXamarin的库,请选择. NET标准库

. NET Core最终将实现. NET Standard 2(如Xamarin. NET Framework

因此,. NET CoreXamarin. NET Framework可以被识别为. NET标准中的口味

为了使您的应用程序面向未来以进行代码共享和重用,您宁愿实现。NET标准库。

Microsoft还建议您使用. NET标准而不是便携式类库

引用MSDN作为权威来源,. NET标准意在一个图书馆统治他们所有人。由于图片胜过千言万语,以下内容将使事情变得非常清楚:

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

像我们大多数人一样,你可能会遇到以下情况:(. NET Framework、Xamarin和现在的. NET Core风格的应用程序)

在此处输入图片描述

2… NET标准库将为您提供什么(跨框架兼容性)

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

一个库来统治他们所有

不耐烦的人:

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

对于一个表,以帮助了解您可以针对的最高版本的. NET Standard,基于您打算在其上运行的. NET平台,到这里来

来源:MSDN:介绍. NET标准

. NET Standard的存在主要是为了改进代码共享并使每个. NET实现中可用的API更加一致。

在创建库时,我们可以将目标设置为. NET Standard 2.0,以便创建的库与不同版本的. NET Framework兼容,包括. NET Core、Mono等。

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

. NET Core:把它看作是旧的. NET框架的延续,只是它是开源的,有些东西还没有实现,有些东西已经被弃用了。它用额外的功能扩展了. NET标准,但它只能在桌面上运行。当添加它作为依赖项时,你可以在Windows、Linux和OS X上制作可运行的应用程序。(虽然现在只是控制台,没有GUI)。所以. NET Core=. NET Standard+桌面特定的东西。

UWP也使用它,新的ASP.NET核心也使用它作为依赖项。

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

. NET Standard是一种标准(换句话说,一种规范)。

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

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

我希望这将有助于理解. 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 Coreinterface INetCoreApp10 : INetStandard15{// TODO: .NET Core 1.0 specific APIs}// Windows Universal Platforminterface IWindowsUniversalPlatform : INetStandard13{void GPS();void Xaml();}
// Xamarininterface 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}
}

来源

另一种解释差异的方法可以用现实世界的例子来解释,因为我们大多数人只是凡人会使用现有的工具和框架(XamarinUnity等)来完成这项工作。

因此,使用. NET Framework,您可以使用所有. NET工具,但您只能针对Windows应用程序(UWPwindows窗体ASP.NET等)。由于. NET Framework是闭源的,因此对此无能为力。

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

使用. NET Standard,您的工具甚至更少,但您可以针对所有/大多数平台。由于Xamarin,您可以针对移动,由于Mono/Unity,您甚至可以针对游戏机。使用UNO平台和Blazor也可以针对Web客户端(尽管两者现在都有点实验)。

在现实世界的应用程序中,您可能需要使用所有这些。例如,我开发了一个销售点应用程序,其架构如下:

共享server和slent:

  • 处理我的应用程序模型的. NET标准库。
  • 处理客户端发送的数据验证的. NET标准库。

由于它是一个. NET标准库,因此可以在任何其他项目(客户端和服务器)中使用。

在. NET标准库上进行验证也是一个很好的优势,因为我可以确保在服务器和客户端上应用相同的验证。服务器是强制性的,而客户端是可选的,有助于减少流量。

服务器端(Web API):

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

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

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

客户端(MVVM withWPF+Xamarin. Forms Android/iOS):

  • 处理客户端API连接的. NET标准库。

  • 处理模型逻辑的. NET标准库。它用于所有的观点

  • 处理WPF视图的. NET Framework WPF应用程序Windows应用程序。WPF应用程序现在可以是。NET核心,尽管它们目前只能在Windows上工作。AvaloniaUI是为其他桌面平台制作桌面 GUI应用程序的好选择。

  • 处理Xamarin表单视图的. NET标准库。

  • Xamarin Android和XamariniOS项目。

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

前面的答案可能描述了对. NET Core、. NET Standard和. NET Framework之间差异的最佳理解,所以我只想分享我在选择这个而不是那个时的经验。

在您需要在. NET Framework、. NET Core和. NET Standard之间混合的项目中。例如,在我们使用. NET Core 1.0构建系统时,不支持使用. NET Core托管Windows服务。

下一个原因是我们使用的是不支持. NET Core的Active Report。

因此,我们希望构建一个可用于. NET Core(ASP.NETCore)和Windows服务和报告(. NET Framework)的基础结构库->这就是我们选择. NET Standard作为此类库的原因。选择。NET标准意味着您需要仔细考虑库中的每个类都应该简单且交叉。NET(核心、框架和标准)。

结论:

  • . NET标准的基础结构库和共享公共。此库可由. NET Framework和. NET Core引用。
  • . NET Framework用于不受支持的技术,如Active Report、Windows Services(现在支持. NET 3.0)。
  • . NET CoreASP.NETCore。

微软刚刚宣布. NET 5:. NET 5简介

. NET Framework

windows窗体,ASP.NET和WPF应用程序必须使用. NET Framework库开发。

. NET标准

Xamarin、iOS和Mac OS X应用程序必须使用. NET标准库开发

. NET Core

通用Windows平台(UWP)和Linux应用程序必须使用. NET Core库开发。该API以C++实现,您可以使用C++,VB.NET,C#,F#和JavaScriptlanguages.NET

每个框架都有自己的类库。

  • . Net Framework的基类库。
  • . net核心的核心库。
  • Xamarin的Mono类库。

Microsoft已决定将所有这些类库整合到一个可在所有框架中实现的库中。为此,他们开发了. Net标准。

微软已经决定建立一个统一的框架。Net 5是. Net core和. Net Framework的统一框架。在. Net 6中,他们将. Net MAUI项目下的Xamarin与. Net合并。

. Net Framework、. Net Core、Xamarin统一为一个单一的Framework. Net 6,所以不需要. Net标准。. Net标准的目标是拥有一个适用于所有框架的库。现在所有框架都合并到. Net 6中。

. NET Core. NET Core是托管框架的免费、跨平台、开源实现。它支持四种类型的应用程序:控制台、ASP.NET核心、云和通用Windows平台(UWP)。Windows窗体和Windows演示基础(WPF)不是. NET Core的一部分。

从技术上讲,. NET Core仅支持控制台应用程序。ASP.NETCore和UWP是构建在. NET Core之上的应用程序模型。

与. NET Framework不同,. NET Core不被视为Windows组件。因此,更新以NuGet包的形式出现,而不是通过Windows Update。由于. NET Core运行时已安装App-Local,并且应用程序通过包管理器进行更新,因此应用程序可以与特定的. NET Core版本相关联并单独更新。

. NET Standard托管框架的每个实现都有自己的一组基类库。基类库(BCL)包含异常处理、字符串、XML、I/O、网络和集合等类。

. NET标准是实现BCL的规范。由于. NET实现需要遵循此标准,因此应用程序开发人员不必担心每个托管框架实现的BCL版本不同。

框架类库(FCL),如WPF、WCF和ASP.NET不属于BCL,因此不包含在. NET Standard中。

. NET Standard和. NET实现之间的关系与超文本标记语言规范和浏览器之间的关系相同。

因此,. NET Framework、Xamarin和. NET Core各自在其托管框架中为BCL实现. NET Standard。由于计算机行业将继续引入新的硬件和操作系统,因此将出现新的. NET托管框架。此标准允许应用程序开发人员知道他们可以依赖一组一致的API。

每个. NET版本都有一个关联的. NET标准版本。

通过提供一致的API,将应用程序移植到不同的托管实现以及提供工具变得更加容易。

. NET Standard被定义为单个NuGet包,因为所有. NET实现都需要支持它。工具变得更容易,因为这些工具具有一组一致的API可用于给定版本。您还可以为多个. NET实现构建单个库项目。

您还可以为特定于平台的API构建. NET标准包装器。