前言
有时候,我们从 Nuget 下载第三方包时,会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外,还会要求 .NET Standard 的版本,比如这样:
这个神秘的 .NET Standard 是什么呢?
.NET Standard 的诞生
在 .NET 的大家庭中有 .NET Framework、.NET Core、Xamarin 等具体的实现,在这些实现中,有一些其他实现所不具有的特性。
比如,.NET Framework 中有访问 Windows 注册表的类,很显然这是其他实现所不具备的;再如,Xamarin 中有拨打电话的类,很显然这也是其他实现所不具备的。
但是这些实现也有一些可以共享的类,比如读写文件的类、List 集合类、字符串类等。如果每个 .NET 实现中,这些可以共享的类都有自己的一套做法,可能就会造成一些问题,比如:
-
有可能出现同样功能的类在不同的实现中各不相同的情况,比如在 .NET Framework 中操作文件的类叫 FileStream,但是到了 .NET Core 中对应的类叫 Storage,这样如果我们想开发一个读写文件的代码库供 .NET Framework、.NET Core 等使用,代码编写起来就很麻烦了。
-
由于不同的实现中方法名不一致,我们需要花费更多的时间来理解和修改代码,代码会变得难以维护。
-
代码可读性就变得更差,代码阅读和理解起来变得很困难。
如果能够这些可以共享的类制定一个规范,无论是 .NET Framework、.NET Core 还是 Xamarin 都要遵守这个规范。比如这个规范规定操作文件的类必须叫 FileStream,而且 FileStream 类必须要有 Read、Write、Flush 等方法,参数和返回值也必须统一,这样编写通用库的时候就会简单很多了。这个 "各个实现通用的基础库规范" 就叫作.NET Standard。
所以,.NET Standard 是一个规范,规定了一系列需要被所有 .NET Core、.NET Framework 及 Xamarin 等共同实现的 API,包括有哪些类、有哪些方法、参数和返回值是什么等。
.NET Standard 和 .NET Core、.NET Framework 对应关系
注意,.NET Standard 只是规定了需要被实现的规范,但是不负责具体实现,对于在 .NET Standard 中规定的类、方法,.NET Core、.NET Framework 及 Xamarin 等必须实现,因此 .NET Standard 相当于定义了 .NET Core、.NET Framework、Xamarin的交集,只要是 .NET Standard 类库,都可以被 .NET Core、.NET Framework、Xamarin 等项目引用。
.NET Standard 随着 .NET 技术的升级而升级,不同版本的 .NET Core、.NET Framework 等支持不同版本的 .NET Standard,越高版本的 .NET Core、.NET Framework 等支持的 .NET Standard 版本越高。
以下是 .NET Standard 和 .NET Core、.NET Framework 对应关系:
- .NET Standard 1.0:.NET Core 1.0,.NET Framework 4.5
- .NET Standard 1.1:.NET Core 1.0,.NET Framework 4.5
- .NET Standard 1.2:.NET Core 1.0,.NET Framework 4.5.1
- .NET Standard 1.3:.NET Core 1.0,.NET Framework 4.6
- .NET Standard 1.4:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 1.5:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 1.6:.NET Core 1.0,.NET Framework 4.6.1
- .NET Standard 2.0:.NET Core 2.0,.NET Framework 4.6.1
- .NET Standard 2.1:.NET Core 3.0
我们可以开发自己的 .NET Standard 类库吗?
可以。
如果我们要编写一个给公众使用的类库,为了让 .NET Core、.NET Framework 等开发人员都能使用这个类库,那么我们就可以创建自己的 .NET Standard 类库项目。
开发 .NET Standard 类库有个小技巧就是先把项目的 .NET Standard 版本选到最低,如果发现开发时用到的类在这个 .NET Standard 版本中不存在,再逐步在项目属性的 "目标框架" 中提升项目的 .NET Standard 版本,这样有助于提高这个类库的可用范围,因为 .NET Standard 的版本低一些,低版本的 .NET Core、.NET Framework 的项目也能使用这个类库。
最后
.NET Standard 的版本只到 2.1,从 .NET 5 开始,微软不再更新 .NET Standard,而是会把 .NET x 等视为单一的代码库,通过编译期和运行时的检查来解决不同平台下它们所支持的功能具有差异这一问题。
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步