在Visual Studio中新建项目的时候,除了.NET Framework和.NET Core之外,我们还会看到.NET Standard的身影,如图1所示。
在“类库”项目中,.NET Standard和.NET Core、.NET Framework具有同等地位,但是.NET Standard只在“类库”项目中出现过,在“控制台”“Web应用程序”等项目中都没有它的身影。那么.NET Standard到底是什么呢?
![](https://pic3.zhimg.com/80/v2-fc0c08145e68edaff307acdaca2808c6_720w.jpg)
在.NET大家庭中有.NET Framework、.NET Core、Xamarin等具体的实现,在这些实现中,有一些其他实现所不具有的特性。比如,.NET Framework中有访问Windows注册表的类,很显然这是其他实现所不具备的;再如,Xamarin中有拨打电话的类,很显然这也是其他实现所不具备的。但是这些实现也有一些可以共享的类,比如读写文件的类、List集合类、字符串类等。假如每个.NET实现中,这些可以共享的类(也叫“基础库”)都有自己的一套做法,如图2所示,就有可能出现同样功能的类在不同的实现中各不相同的情况,比如在.NET Framework中操作文件的类叫FileStream,但是到了.NET Core中对应的类叫Storage。这样就会带来一个问题:如果我们想开发一个读写文件的代码库供.NET Framework、.NET Core等使用,代码编写起来就很麻烦了。
反之,如果微软为文件操作、集合等所有.NET实现中都具有的部分制定一个规范,无论是.NET Framework、.NET Core还是Xamarin都要遵守这个规范。比如这个规范规定操作文件的类必须叫FileStream,而且FileStream类必须要有Read、Write、Flush等方法,参数和返回值也必须统一。
这样编写通用库的时候就会简单很多了。这个“各个实现通用的基础库规范”叫作.NET Standard,如图3所示。
.NET Standard规定了一系列需要被所有.NET Core、.NET Framework及Xamarin等共同实现的API,包括有哪些类、有哪些方法、参数和返回值是什么等。需要说明的是,.NET Standard只是一个规范,不是一个框架。不要以为.NET Standard是一个被.NET Framework、.NET Core、Xamarin等共用的基础库,.NET Standard只是规定了需要被实现的规范,但是不负责具体实现。
![](https://pic2.zhimg.com/80/v2-1e47a1c9334d2d49c920340fd2f3dc45_720w.webp)