微软Ignite 2016 新名词:.NET Standard 2.0

这几天(9月26日-30日)微软Ignite 2016(去年起由 Ignite 取代 TechEd)正在美国如火如荼的召开,乍见一个新名词:.NET Standard 2.0。 我得了一种听到新名词就会焦虑的病,赶紧查数据压压惊…

.NET Team Blog 同步发布了一篇介绍文,可说是目前最详细最权威的数据源,抱着懂个大概就好的心态,整理重点如下。

先用两张图说明为什么没事要搞出一套 .NET Standard 新标准? (注:图片取自 MSDN Blog 文章

.NET Standard 的核心使命在于解决 .NET 跨平台时基础链接库不一致的问题。.NET 发展至今,已初步实现跨平台, 用 C# 就可以写 Windows、macOS、Linux、iOS、Android 程序。 但如下图所示,.NET Framework BCL、.NET Core Library 与 Xamarin 的 Mono Class Library 各自发展,缺乏统一的界面标准,像是System.Collections, System.IO, System.Xml… 这类性质的基础类别,各家支持程度不一,某些 API 可能在某个平台不存在,又或者 API 界面存在差异。

如果你只专注一种平台,当然可以无视各平台基础链接库的差异,专心学好一种就好。 但如果系统被要求跨平台,差异那怕再小,都会跑出来咬你屁股。 首先,你必须搞懂不同平台的差异,第二,差异提高“跨平台共同链接库/组件”开发的难度。 (脑海中出现一堆恶心的 #if NETCORE … #elif XAMARIN … #endif) 。

过去针对跨平台共享链接库的主推做法是PCL(Portable Class Library),取多个平台的交集,筛选保留各平台都支持的 API,但开发者仍需知道不同平台的差异。.NET Standard 则试图规范一套标准基础链接库 API 界面,各平台依此界面实作出一致的链接库,如此程序代码不需修改即可针对不同平台编译、执行。

即使有 .NET Standard,还是无法逃避各平台支持度不一的现况。.NET Standard 版本号码与 API 完整度成正比,与支持平台范广度成反比。.NET Standard 2.0提供的 API 数目一定比 1.0 多,但如果想涵盖 Windows Phone 8.1,就只能选择 .NET Standard 1.0 – 1.2。 dotnetstd-2

随着 .NET Standard 2.0 制定,.NET Core 与 Xamarin 将在新版加入支持,而 .NET Framework 4.6.1 则已符合 2.0 标准。 有没有注意上表的玄机?.NET Standard 1.4 对应到 .NET Framework 4.6.1、1.5 对 4.6.2,结果 2.0 又倒车回到 4.6.1,原来是基于部署普及率考虑,.NET Standard 2.0 拿掉 1.5/1.6 增加但应用不广的 API,好让 .NET Framework 4.6.1 符合 .NET Standard 2.0。 各位同学,今天我们要介绍的成语是-“削足适履”~(笑 )

以下是 .NET Standard 2.0 的主要涵盖范围,细节则参考 github 上的文件。 .NET Standard 2.0 仍在发展中,未来可能还会有变动。

至于一些与平台高度相关的 API,例如:只有 Windows 才有的 Registry、Reflection Emit 功能不适用 .NET Native、UWP、Xamarin iOS。.NET Standard 采取“需额外安装 NuGet Package 才能使用,在不适用平台执行时抛出例外”的原则,不同的 API 处理方式不一。

如果你需要开发跨平台链接库,官方建议改走 .NET Standard,以降低平台相依性,并允许混合参照 PCL 及 .NET Framework,但 PCL 仍适用特定场合,例如:某些平台不在 .NET Standard 支持之列,PCL 是唯一解。 实作上有个 API Port可侦测程序适用的最低 .NET Standard 标准,再配合检查目标平台是否在该标准支持范围,以便决定标准版本。

完整的 .NET Standard 工具支持将内置于下一版本 Visual Studio “Dev 15″,以 NuGet Package 方式加入参照,而未来 Visual Studio、VSCode、Xamarin Studio 均会提供一线支持

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...