這幾天(9/26-30) Microsoft 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。
隨著 .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 均會提供一線支援。
報告完畢。