闲聊 .NET Standard

前言

有时候,我们从 Nuget 下载第三方包时,会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外,还会要求 .NET Standard 的版本,比如这样:

这个神秘的 .NET Standard 是什么呢?

.NET Standard 的诞生

在 .NET 的大家庭中有 .NET Framework、.NET Core、Xamarin 等具体的实现,在这些实现中,有一些其他实现所不具有的特性。

比如,.NET Framework 中有访问 Windows 注册表的类,很显然这是其他实现所不具备的;再如,Xamarin 中有拨打电话的类,很显然这也是其他实现所不具备的。

但是这些实现也有一些可以共享的类,比如读写文件的类、List 集合类、字符串类等。如果每个 .NET 实现中,这些可以共享的类都有自己的一套做法,可能就会造成一些问题,比如:

  1. 有可能出现同样功能的类在不同的实现中各不相同的情况,比如在 .NET Framework 中操作文件的类叫 FileStream,但是到了 .NET Core 中对应的类叫 Storage,这样如果我们想开发一个读写文件的代码库供 .NET Framework、.NET Core 等使用,代码编写起来就很麻烦了。

  2. 由于不同的实现中方法名不一致,我们需要花费更多的时间来理解和修改代码,代码会变得难以维护。

  3. 代码可读性就变得更差,代码阅读和理解起来变得很困难。

如果能够这些可以共享的类制定一个规范,无论是 .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 对应关系:

  1. .NET Standard 1.0:.NET Core 1.0,.NET Framework 4.5
  2. .NET Standard 1.1:.NET Core 1.0,.NET Framework 4.5
  3. .NET Standard 1.2:.NET Core 1.0,.NET Framework 4.5.1
  4. .NET Standard 1.3:.NET Core 1.0,.NET Framework 4.6
  5. .NET Standard 1.4:.NET Core 1.0,.NET Framework 4.6.1
  6. .NET Standard 1.5:.NET Core 1.0,.NET Framework 4.6.1
  7. .NET Standard 1.6:.NET Core 1.0,.NET Framework 4.6.1
  8. .NET Standard 2.0:.NET Core 2.0,.NET Framework 4.6.1
  9. .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 等视为单一的代码库,通过编译期和运行时的检查来解决不同平台下它们所支持的功能具有差异这一问题。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步

相关推荐
EdisonZhou1 小时前
MAF快速入门(11)并行工作流
llm·aigc·agent·.net core
lingxiao168882 小时前
WebApi详解+Unity注入--中篇:.net core的WebAPI
unity·c#·.netcore
ServBay2 小时前
C# 成为 2025 年的编程语言,7个C#技巧助力开发效率
后端·c#·.net
故事不长丨6 小时前
C#进制转换:从基础原理到实战应用
开发语言·c#·进制转换·16进制·2进制·10进制
liulilittle6 小时前
VEthernet 框架实现 tun2socks 的技术原理
网络·windows·c#·信息与通信·通信
云草桑7 小时前
.net AI API应用 客户发的信息提取对接上下游系统报价
ai·c#·.net·semantickernel·sk
故事不长丨8 小时前
C#File文件操作全解析:从基础用法到异常处理
服务器·开发语言·visualstudio·c#·文件操作·io流·file
工程师0079 小时前
C# 动态编程(基于 dynamic 类型)
开发语言·c#·dynamic·动态编程
用户298698530149 小时前
C#: 在Word文档中添加或移除可编辑区域
后端·c#
爱说实话10 小时前
C# 2026
c#