.NET Standard提供的API主要是根据现有.NET Framework来定义的,它的版本升级反映了其提供的API不断丰富的过程,目前最新版本(.NET Standard 2.0)提供的API数量在前一版本基础上几乎翻了一番。Visual Studio提供相应的项目模板帮助我们创建基于.NET Standard的类库项目,这样的项目会采用专门的目标框架别名netstandard{version}。一个针对.NET Standard 2.0的类库项目具有如下的定义,我们可以看到它采用的目标框架别名为 “.NET Standard 2.0” 。
对于演示的这个实例来说,这个NetStandardLib类库项目针对的目标框架为.NET Standard 2.0,后者最终体现为一个名为NetStandard.Library.nupkg的NuGet包,这一点其实可以从Visual Studio针对该项目的依赖节点可以看出来。如下图所示,这个名为NetStandard.Library的NuGet包具有一个核心的程序集netstandard.dll,上面我们所说的.NET Standard API就定义在该程序集中。
也就是说,所有.NET Standard 2.0项目都具有针对程序集netstandard.dll的依赖,这个依赖自然也会体现在编译后生成的程序集上。对于我们演示实例中的这个类库项目NetStandardLib编译生成的同名程序集来说,它针对程序集netstandard.dll的依赖体现在如下所示的元数据中。
上面这个简单的类型基本上揭示了.NET Standard为什么能够提供全平台的可移植性,我们现在来对此做一个简单的总结。.NET Standard API由NetStandard.Library这个NuGet包来承载,后者提供了一个名为netstandard.dll的程序集,保留在这个程序集中的仅仅是. NET Standard API的存根(Stub),而不提供具体的实现。所有对于一个目标框架为.NET Standard的类库项目编译生成的程序集来说,它们保留了针对程序集netstandard.dll的引用。
.NET平台的三大分支(.NET Framework、.NET Core和Xamarin)按照自己的方式各自实现了.NET Standard规定的这套标准的API。由于在运行时真正承载.NET Standard API的类型被分布到多个程序集中,所以. NET Standard程序集能够被复用的前提是运行时能够将这些基础类型链接到对应的程序集上。由于. NET Standard程序集是针对netstandard.dll进行编译的,所以我们只需要在各自环境中提供这个同名的程序集来完成类型的转移即可。
.NET Core跨平台的奥秘[上篇]:历史的枷锁
.NET Core跨平台的奥秘[中篇]:复用之殇
.NET Core跨平台的奥秘[下篇]:全新的布局