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对比