ASP.NET Core项目开发实战入门
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 .NET Standard

3.1 .NET Standard介绍

.NET Standard是一种规范,是所有.NET平台必须实现的一组API。我们可以把.NET Standard视为适用.NET的POSIX(可移植操作系统接口)。

.NET Standard可实现以下重要情境:

●为所有.NET实现定义一组统一的、与工作负荷无关的BCL API。

●使开发人员能够通过同一组API生成可在各种.NET实现中使用的可移植库。

●减少甚至消除由.NET API导致的对共享源代码进行的条件性编译(仅适用于OS API)。

各种.NET实现以特定版本的.NET Standard为目标。每个.NET实现版本都会公布它支持的最高.NET Standard版本,这种声明意味着它也支持以前的版本。例如,.NET Framework 4.6实现.NET Standard 1.3。也就是说,它会公开在.NET Standard版本1.0到1.3中定义的所有API。同理,.NET Framework 4.6.1实现.NET Standard 1.4,而.NET Core 1.0则实现.NET Standard 1.6。

3.1.1 版本

表3-1列出了支持每个.NET Standard版本的最低平台版本。

表3-1

说明如下:

●N/A表示.NET Framework不支持.NET Standard 2.1或更高版本。

●各单元格中的版本号指示要定向到此.NET Standard版本所需的最低实现版本。

若要查找可以定位的.NET Standard最高版本,则按照以下步骤操作即可:

①查找要运行的.NET实现所在的行。

②在这一行中,从右向左查找可以定位的.NET Standard版本所在的列。

③列标题指示目标支持的.NET Standard版本。

④对要定位的每个平台重复执行此过程。如果有多个目标平台,则选择它们都支持的最高版本。例如,如果要在.NET Framework 4.5和.NET Core 1.0上运行,则可以使用的最高.NET Standard版本是.NET Standard 1.1。

1.应使用哪个.NET Standard版本

在选择.NET Standard版本时,应权衡以下因素:

●版本越高,可使用的API越多。

●版本越低,可实现的平台越多。

通常,建议尽可能使用最低版本的.NET Standard。因此,在找到可以指向的最高版本.NET Standard后,请按照以下步骤操作:

①指向前一更低版本的.NET Standard,然后生成项目。

②如果成功生成项目,则重复执行第①步。否则,重新指向下一个较高的版本,这就是应该使用的版本。

但是,针对较低版本的.NET Standard会引入许多支持依赖项。如果项目面向.NET Standard 1.x,则建议同时使用.NET Standard 2.0。这简化了在.NET Standard 2.0上运行的库用户的依赖项关系,并减少了需要下载的软件包数量。

2..NET Standard版本控制规则

版本控制规则主要有两个:

●累加性:.NET Standard版本在逻辑上形成同心圆。也就是说,较高的版本包含较低的版本的所有API。版本之间没有重大更改。

●不可变:一旦发布,.NET Standard版本就会被冻结起来。新API首先会在特定的.NET实现(如.NET Core)中可用。如果.NET Standard评审委员会认为新API可应用于所有.NET实现,则会将它们添加到新的.NET Standard版本中。

3.1.2 规范

.NET Standard规范是一组标准化的API,此规范由.NET实现者进行维护,具体来说,就是由Microsoft(包括.NET Framework、NET Core和Mono)和Unity进行维护。

1.正式规范

正式规范是一组用于定义标准中包含API的.cs文件。dotnet/standard仓库中的Ref目录定义了.NET Standard API。

NETStandard.Library元包描述用于部分定义一个或多个.NET Standard版本的库集。

给定的组件(如System.Runtime)描述如下:

●.NET Standard的一部分(即其范围)。

●.NET Standard在此范围内的多个版本。

标准库提供派生项目以方便读取,并实现某些开发人员方案(例如,使用编译器):

●Markdown中的API列表;

●引用程序集,以NuGet包的形式分发,由NETStandard.Library元包引用。

2.包表示形式

.NET Standard引用程序集的主要分发载体是NuGet包。NuGet包面向一个或多个框架,其定位是“.NET Standard”框架。可以使用netstandard精简TFM(例如netstandard1.4)来设定.NET Standard框架作为目标。如果构建的库将在多个运行时上运行,则应将此框架作为目标。对于最广泛的API集,可将netstandard2.0设定为目标,因为.NET Standard 2.0的可用API数量比.NET Standard 1.6的两倍还多。

NETStandard.Library元包引用定义.NET Standard的一整套NuGet包。要指定netstandard作为目标,最常见的方法是引用此元包。它描述并提供了对大约40个.NET库及定义.Net Standard的相关API的访问权限。可以引用以netstandard为目标的其他包来使用其他API。

3.版本管理

规范并不是单一的,而是一组版本不断呈线性递增的API。该标准的第一个版本建立了一组基准API。后续版本将添加API,并继承以前版本定义的API。在从标准中移除API方面,并没有成文的规定。

.NET Standard并不特定于任何一种.NET实现,也不与其中任一运行时的版本控制方案匹配。

添加到任何实现(例如.NET Framework、.NET Core和Mono)的API可被视为适合添加到规范中的候选项,尤其是本质上非常重要的API。.NET Standard的新版本根据.NET实现版本进行创建,以便可以定位.NET Standard PCL中的新API。.NET Core版本控制中详细介绍了版本控制机制。

.NET Standard版本控制对于库的使用至关重要。在.NET Standard版本既定的情况下,可以使用指向相同或更低的版本的库。下面介绍使用.NET Standard PCL(专用于.NET Standard定位)的工作流程。

●选择要用于PCL的.NET Standard版本。

●使用依赖相同或更低.NET Standard版本的库。

●如果发现依赖更高.NET Standard版本的库,要么采用相同的版本,要么不要使用此库。

3.1.3 .NET Framework兼容性模式

从.NET Standard 2.0开始,引入了.NET Framework兼容性模式。此兼容性模式允许.NET Standard项目引用.NET Framework库,就像其针对.NET Standard编译一样。引用.NET Framework库并不适用于所有项目,例如使用Windows Presentation Foundation(WPF)API的库。

3.1.4 .NET Standard库和Visual Studio

要在Visual Studio中生成.NET Standard库,请确保在Windows系统上已安装Visual Studio 2017的15.3版本或更高版本,或在macOS上已安装Visual Studio for Mac的7.1版本或更高版本。

如果项目中只需使用.NET Standard 2.0库,也可以在Visual Studio 2015中执行此操作。但是需要安装NuGet Client 3.6或更高版本。可以从NuGet下载页面下载适用Visual Studio 2015的NuGet客户端。

3.1.5 .NET Standard图解

图3-1形象地描述了.NET Standard。

图3-1

从图3-1中可以看出,.NET Standard适用于WPF、Windows Forms、ASP.NET、UWP、ASP.NET Core,基于Xamarin支持iOS、OS X和Android。