.NET Standard 2.0 是什麼?可以吃嗎?
轉自http://blog.darkthread.net/post-2016-09-27-net-standard-2-0.aspx 黑暗執行者
.NET Standard 2.0 是什麼?可以吃嗎?
這幾天(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 均會提供一線支援。
報告完畢。
.NET Standard 2.0 是什麼?可以吃嗎?