.NET 的未來與發展

在今年 2016 微軟 Build 大會中有一場 Session 「.NET Overview」中,說明了 .NET Framework、.NET Core、Xamarin 這三項平台技術的未來趨勢與發展

前言

在今年 2016 微軟 Build 大會中有一場 Session 「.NET Overview」中,說明了 .NET Framework、.NET Core、Xamarin 這三項平台技術的未來趨勢與發展,影片可參考下面 Channel 9 連結:

[Channel 9] - .NET Overview

圖(一)、.NET 平台家族 [圖片取自 Channel 9 - .NET Overview]

  • .NET Framework 會基於 Windows 平台繼續發展下去
  • .NET Core 則提供一個開放原始碼且跨平台與效能最佳化的 Modern App 或 Web App 的平台
  • Xamarin 則是提供一個跨 Device (裝置/平台) 可在 iOS、Android、Windows Phone 上面執行且基於 Mono Base 平台與開放原始碼的開發框架

在這個 Session 中,Scott Hanselman與 Scott Hunter 反思這一路走來的這三個平台的演化,本來是為了使開發人員以最少的程式碼移植到不同的平台,比如:.NET Core 的 MVC,以及專注在原本的 C#而移轉到 iOS、Android 等平台,但為了跨不同平台,微軟的開發團隊幾乎是將大部分 .NET Framework 無法跨到 Linux 等相依於 Windows 的核心 API 幾乎都移除掉之後,也才成功的發展出能夠跨 MAC OS、Linux、Ubuntu 等不同平台的 .NET Core 出來,但耶因為移除掉太多函式庫導致許多微軟客戶進行移植時遭遇到許多的困難。

因為一直以來,微軟便是承諾開發人員具有高生產力的部分,對微軟來說非常重要的一件事,所以目標是希望開發人員不會因為這三個平台就要改寫 .NET 程式碼,希望做到 .NET BCL (Base Class Library) 無所不在的目的。於是 .NET Standard Library 因應而生,如下圖:

圖(二)、.NET Standard Library [圖片取自 MSDN Blog]

如上圖、透過 .NET Standard Library 使開發人員輕輕鬆鬆的在這三個平台上共享程式碼。

連結(一)、.NET Overview

https://channel9.msdn.com/Events/Build/2016/B891

然而,社群之前有人在詢問 .NET Standard Library 是否就接觸不到 .NET 的核心部分?這部分在當時也有做回答,就是:現在許多用戶其實都影經習慣了使用 XCOPY 方式部署 .NET 應用程式了,這個方式在 .NET Standard Library 正式推出後也不會改變,頂多是 XCOPY 過去的檔案的 BCL 可能會增加,盡量不改變使用者原有習慣,下面探討發展中的.NET Standard Library 2.0

 

什麼是 .NET Standard Library 2.0?

許多人應該會發現 .NET Standard Library 跟之前的可攜式類別庫 PCLs (Portable Class Libraries)不是在做同一件事嗎?事實上,PCLs 只是讓您可以編譯出無關於平台 (類似 AnyCPU概念,但它同時篩選掉各平台不支援的 API),但是他也只能讓你在 Windows、Windows Phone、Silverlight 之間共享的類別庫,不是共享在所有平台 BCL 上,也就是說,它還是相依了特定平台的 BCL,比如說,你沒有辦法在 UWP 的 BCL 上使用。而 .NET Standard Library 2.0 便是要解決這樣的問題,這問題可由下圖來呈現

圖(三)、各平台現況 [圖片取自 MSDN Blog]

要探討 .NET Standard Library 之前,還是要回歸到太多 .NET Framework 的維護、無法共用等問題,這也與先前 .NET Core 被設計出來的初衷相同,這部分可以看筆者先前文章「快速了解 ASP.NET 5 與 MVC 6 懶人包系列(一)」,而現在發展中的 .NET Standard Library 2.0 則是要解決 BCL 的問題。讓開發人員使用 .NET 在開發 Desktop App (UWP/Windows Form)、ASP.NET、或甚至是遊戲等等,都基於同一組 BCL

為什麼需要 .NET Standard Library 2.0 用以下幾點來說明:

  • .NET Standard Library 是一組所有.NET平台必須實現的 API,這種統一的.NET平台,並防止未來散落在各平台的 API (BCL)
  • .NET Standard Library 2.0 將由.NET框架,並針對 .NET Core 與 Xamarin 來設計。對於現在 .NET Core 已經有許多 API 的需求正在做
  • .NET Standard Library 2.0 猶如一層相容的.NET Framework 的 DLL 直接墊在既有的 BCL 上,所以開發人員可以直接參考.NET Standard Library 2.0 函式庫
  • .NET Standard Library 2.0 將取代便攜式類庫(PCLS)作為構建多平台的.NET 函式庫
  • 你可以在 GitHub 上看到.NET Standard Library 2.0 在 DOTNET 上的標準 API 定義


所以,加上 .NET Standard Library 2.0 的概念進來之後,可以變成如下:

圖(四)、.NET 的未來 [圖片取自 MSDN Blog]

如上圖,原本的 「Base Class Library」、「Core Library」、「Mono Class Library」被取而代之的是 .NET Standard Library 2.0,且他的下方還加註了「One library to rule then all」就足以見識到他希望讓開發人員只需要參考同一個 BCL 類別庫,以及在安裝使用 NuGet Packages 套件時,不需要去猜測 NuGet 上所提供的是哪一種平台 BCL 的版本。

而這與原本的 PCLs 的差異在於,PCLs 還是讓你選擇了它可以運作的平台,雖然它可以編譯出不同平台的 DLL,但是他還是被迫要參照某一個平台的 BCL,而 .NET Standard Library 2.0 就不是如此,他會統一並提供呼叫的入口。

圖(五)、現在.NET Standard Library 1.x ~ 2.0 發展概況 [圖片取自 MSDN Blog]

由上面這張簡圖說明了原有的各個版本的框架,如:「.NET Core」、「Full .NET Framework」、「Xamarin.iOS」、「Xamarin.Android」等,如果要支援.NET Standard Library 必須是哪一個版本。

從圖中可以發現,.NET Framework 4.6.1與 4.6.2 以尚可以被 .NET Standard Library 2.0 所支援,如果是 .NET Framework 4.5 則只能夠被 .NET Standard Library 1.1 所支援,而且從圖中還可以發現 .NET Core 1.0 也才被 .NET Standard Library 1.6 所支援,如果要支援 .NET Standard Library 2.0 得等下一個 .NET Core 版本了。

那麼.NET Standard Library 2.0 要如何對應到原有的 BCL,或者說原有的 「.NET Framework」、「.NET Core」撰寫的 LIB 要如何與現有可能是 PCLs 得DLL溝通?可以用下圖來表示:

圖(六)、.NET Standard Library 2.x 溝通的方式 [圖片取自 MSDN Blog]

.NET Standard Library 2.0 再透過一層 「My Standard Library 2.x」與原有的 PCLs 或 Full .NET Framework 的 DLL 之間溝通。

另外,有趣的是,因為微軟開發團對發現 .NET Framework 4.6.1 是目前使用最多的版本,原先 4.6.1 推出時,當時為 .NET Standard Library 1.4,所以刻意讓 4.6.1 能夠被 .NET Standard Library 2.0 所相容。但為了相容,所以會刪除掉 .NET Standard Library 1.5/1.6 當中新增加進來得API。也就是說,如果你是基於相容性在 .NET Standard Library 2.0 裡使用 4.6.1,你會用不到 .NET Standard Library 1.5/1.6 所提供的功能,這是需要注意的地方。

 

目前到底有哪些 BCL 含括在 .NET Standard Library 2.0 中?

圖(七)、目前含括進來的 Lib [圖片取自 MSDN Blog]

目前,能夠含括進來都會盡量含括進來,一些特定平台得 API 會改以 NuGet 方式呈現,比如:

  • Microsoft.Win32.Registry

不過您如過在不支援的平台安裝了這個套件(也就是說,你還是可以裝的進來,但是不能用),在使用的時候會得到 PlatformNotSupportedException 的錯誤訊息。

  • AppDomain

關於 AppDomain 的部分,牽涉到作業系統、處理緒實作方式,這在不同平台(MAC OS/Linux…)間都不同,所以只能使用模擬的方式,未來還會怎麼實作其實目前也還沒決定。

  • Reflection

反射的部分會支援,如果是邏輯上行的通的話,其他會用 emit 方式,或是表示式來達到。

 

身為一個元件的開發者,應該怎麼辦?

如果你是一個元件的開發商,建議現在開始支援 .NET Standard Library 2.0 的標準,以免未來需要更多修改成本,為什麼這麼說呢?

就算你使用 PCLs 你還是得考慮部署目標平台得問題,就是你得DLL要提供哪些平台不標可以使用?目前 PCLs 採用的作法是在 NuGet 裡面使用比如「portable-net45+win8」等方式來解決,但如果又有新的平台出現,你就得多編譯一個 portable lib 出來

另外就是平台得可用性問題,使用 .NET Standard Library 2.0 你就不必自己承擔這樣的問題,還有機會支援更多的平台。

結論

.NET Standard Library 已經要推進到 2.0 版了,為了讓各平台間 re-using 程式碼變的更加的容易,且支援 .NET Core 與 UWP 並在 .net Standard Library 提供更多的 API,因此,建議開始使用 .NET Standard Library 而不是用 PCLs,而且 .NET Standard Library 2.0 會隨著 Visual Studio 15 (下一版) 一起推出。

參考資料:

https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/

https://github.com/dotnet/standard/blob/master/docs/netstandard-20/netstandard-20-removals.md

https://github.com/dotnet/standard

https://github.com/dotnet/standard/blob/master/docs/netstandard-20/README.md#assembly-unification

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

https://blogs.msdn.microsoft.com/dotnet/2016/05/27/making-it-easier-to-port-to-net-core/


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^