初探 .NET Core 3於Desktop的支援

.NET Core 第一次 (2016/6) 出現,到第一版的 RC 1(2016/9),至今已過了兩年,正式版本號也推進到了 2.2,前兩個主要版本開發標的均聚焦於跨平台與 Server-Side(ASP.NET)的支援,隨著基礎建設 (BCL)的日趨完善,.NET Core 3.0 開始轉移開發焦點至 Desktop部分,納入了 WPF、WinForm、UWP,還有 Entity Framework 6。也就是說未來的 .NET Core 3.0可以取代 NET Framework來進行 Windows GUI的開發,以目前披露的訊息及實作來看,GUI 的部分依舊是維持在 Windows平台上,不具備跨平台的能力。

 

技術的背後

  既然是不具備跨出 Windows 平台的能力,那麼不用  .NET Framework 而改採  .NET Core 的優點是什麼?就目前看來,優點有兩個,可以藉助 .NET Core 的封裝能力,把 .NET Core 與 GUI程式一併分發,也就是客戶端不需要事先安裝 .NET Core,同時因為應用程式與使用的 .NET Core 版本封裝在一起,免除了當共用的 .NET Core 更新產生Break Changes 導致應用程式運作不正常的情況。另一個優點是 .NET Core 是一個快速更迭的的產品,Microsoft 將其定位於時常更新,比起每次更新都要慎重再慎重的 .NET Framework,.NET Core 對於錯誤修正的反應速度將會快很多,畢竟 .NET Framework 是一個隨 Windows 出貨的產品,每次的更新都要特別小心不產生 Break Changes。

 

Exclusive .NET Core

  通常,當底層抽換( .NET Framework->.NET Core ),會引發一些想像,例如這樣一來是否可以在 WPF/WinForm/EF6 中使用 .NET Core 獨有的功能,.NET Core 是一個現代化的 .NET Framework,其運用了較近代的技術重新設計與實作了 .NET Framework 大部分的底層功能,賦予跨平台的能力,但很小心的保留的對外的介面,且在特定時間反饋回 .NET Framework ,所以除了跨平台與新的 ASP.NET 之外,你都能在 .NET Framework 取得類似的功能,當然,時間上可能會慢一些,效能上也可能因為底層的實作不同而有所差異。因此,如果評估是否把 WPF 等 GUI 程式轉移至 .NET Core,在現行狀態下,只有以上提及的封裝問題,還有快速更迭可稱為優點。

 

不負責預測

  雖說目前看起來把 GUI 移轉到 .NET Core 上好處不多,但其實多少可以預測的到黃金交叉的來臨,畢竟 Microsoft 已經將重心移轉到 .NET Core 上,未來 .NET Core 持續演化而取代 .NET Framework 也不是不可能的事。

 

落地

  目前 .NET Core 3  處於 Preview 1,可以由以下網址取得,有 x86/x64 兩個版本。

https://dotnet.microsoft.com/download/dotnet-core/3.0

SDK 記得是中間那個。

開發工具目前可以使用 Visual Studio 2017 15.9 或是Visual Studio 2019 Preview 1,前者需要做一些調整,兩個目前都不支援 GUI 的可視及所得功能,也就是說需要以程式方式建立 UI(WPF 使用 XAML Editor),未來的 Visual Studio 2019 會提供可視及所得的 GUI Designer。

安裝好 SDK 後可以透過 Visual Studio Prompt  命令列工具來建立 WPF 或是 WinForm 專案。

WPF 專案

dotnet new wpf -o wpfDemo2

WInForm 專案

dotnet new winform -o winformDemo2

後面的 -o 是指定專案名稱,正常情況下會產生類似以下的結果。

建立好專案後可以透過 Visual Studio 2017 或是 Visual Studio 2019 開啟,Visual Studio 2017 需要啟用 .NET Core Preview 選項。

開啟專案時會提示目前是使用的 .NET Core 3 並未支援,功能運作可能不正常,不過可以正常編譯沒問題。

正常情況將如下圖

可以看到 Windows Desktop SDK 的出現,在 .NET Core 3 中,Windows Desktop SDK 是由 NuGet 取得並安裝,直接編譯後執行如下圖。

下圖是 WinForm 的。

如果想看 Windows Desktop SDK 的內容,其位於 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0-preview-27122-01 目錄中,細看一下,其實是把 WinForm/WPF 用到的 Assembly 集合起來。

當然,不只是這樣,這些 Assembly 的版本號是4.8,而且版本號與目前的 .NET Framework 4.8 preview不同。

再近一點看,編譯後產生出來的檔案如下。

與 .NET Framework 不同,.NET Core 3 主要是產生包含 IL Code 的 DLL,目前看到的 .exe 是一個原生的 Bootloader,不包含 IL Code,會依據 runtimeconfig.json 來尋找 .NET Core 3 並載入 DLL 的前導程式。

 

單一封裝

  .NET Core 3 的特點之一就是可以把 Runtime 跟應用程式打包,這樣一來分發應用程式時就不用再另外分發或安裝 .NET Core 3,這可以用 Visual Studio 2017 的 Publish 功能達到。

完成後會得到以下的結果。

就目前的版本而言,整體大小約在 93MB 左右。

 

相容性

  我嘗試移轉一個較為複雜的 XAML,目前看來相容性不錯(還是會有許多 XAML的錯誤誤報),基本上由於對外界面不變,這是可以預期的結果。

 

畢竟是Preview 1

  我很好奇轉成 .NET Core 之後的效能及記憶體用量如何,很可惜的是目前的版本尚未優化,簡單一個 WPF 應用程式會需要 46MB 的記憶體。

同樣的程式在 .NET Framework 是 19MB,兩者都是 64 bit 應用程式。

希望未來能藉助 .NET Core 3 的輕量化特性減少記憶體用量。

 

未來

  .NET Core 3 重新拉回了 WPF/WinForm/UWP/EF6,會為沉寂已久的 GUI 應用注入一股活水,畢竟 Windows 的 GUI 介面不停地更新,以前的 WPF/WinForm 控制項在現在看來都已經略為過時,我還蠻期待未來的變化的。