2.2 .NET Standard简介

.NET Standard是一套.NET规范或标准,这套标准定义了所有.NET平台都应实现的接口,即API。因此,.NET Standard不像.NET Core一样,并不是一个平台(Platform)。

在上一节中也提到了.NET Core与.NET Framework两个.NET平台,除了这两个平台,.NET平台还包括Xamarin。Xamarin作为微软移动战略的一部分,是一个跨平台的移动应用开发解决方案,简化了针对多种平台的应用开发,包括iOS和Android等。.NET目前的主要平台如图2-1所示。

图2-1 .NET平台

每个平台支持不同的应用模型,并且每个平台都基于相应的基础类库(BCL)。对于这些不同的.NET平台,存在的主要问题是代码共享或者类库共享。例如,要使它们使用同一套业务逻辑,就需要分别创建多个代码相同但目标平台却不同的类库项目,如图2-2所示。

图2-2 不同平台的类库

而.NET Standard的出现正是为了解决这一问题。正如其定义中提到的,它并不是一个新的.NET平台,而是一套标准或者规范,它定义了能适用于所有.NET平台的接口,如图2-3所示。

图2-3 .NET Standard

此时,为了解决类库共享的问题,只要创建一个.NET Standard类库,并由不同平台的.NET应用程序引用即可。图2-4显示了多个平台可以共同引用相同的.NET Standard类库。在.NET Standard中定义的规范或接口,在每一个具体的.NET平台中均有实现。

图2-4 .NET Standard与其他.NET平台

作为一套标准,.NET Standard有不同的版本,不同的.NET Standard版本定义的接口数量或范围也不一样,因此每个.NET平台在其不同的版本中也实现了不同的.NET Standard版本。比如,.NET Core 1.0实现了.NET Standard 1.6,而.NET Core 2.0实现了.NET Standard 2.0,其完整的版本如图2-5所示。

图2-5 .NET Standard版本(资料来源:微软官网)

图2-5列出的.NET Standard最高版本为2.0,.NET Standard 2.0是对.NET Standard 1.6的重大升级,在.NET Standard 1.6中包括了大约13000多个API,而.NET Standard 2.0将API数量增加到32000多个,其中主要包括以下几个方面。

IO:Files、Compression、MMF。

XML:Xlinq、XML Document、Xpath、Schema、XSL。

Serialization:BinaryFormatter、DataContract、XML。

Threading:Threads、Thread Pool、Tasks。

Data:DataTable、DataSet、Provider model。

Networking:Http、Sockets、Websockets、Mail。

Core:Primitives、Collections、Linq、Reflection、Interop。

.NET Standard最新的版本为2.1,该版本新增加3000多个API,它们主要包括Span<T>、ValueTask、ValueTask<T>和DbProviderFactories等。

由于不同的.NET Standard版本包含的API不同,因此在创建.NET Standard类库中,应合适地选择其版本。一般来说,更高版本包括更多的API,但更低版本兼容的平台更多。在Visual Studio中为一个.NET Standard类库项目选择不同的版本很容易,只要在项目的属性中选择不同的目标框架即可,如图2-6所示。

图2-6 .NET Standard类库项目的目标框架

修改目标框架的另一种方法是编辑项目文件(*.csproj),在其中的<TargetFramework>节点中指定不同的.NET Standard版本,如下所示。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

要查询不同.NET Standard版本所包含的API,可以打开微软官网,在页面中选择“.NET Core API参考”选项,即可打开“.NET API浏览器”,在此页面上,选择“.NET Standard”选项,同时选择一个版本,即可看到该版本中所有包含的API,如图2-7所示。

图2-7 .NET API浏览器

图2-8显示了当分别选择.NET Standard 2.0与1.6时,搜索System.Data.DataSet的结果,可以看到,.NET Standard 1.6中并不包括此API。

图2-8 .NET Standard 2.0与1.6 API对比