接下來的幾篇,我想討論下遷移桌面程式到MS Store,可以採用的比較常見、通用性比較強的實施步驟和分層架構。 通常商業項目一般都是不斷的迭代,不太可能突然停止更新現有的桌面版本,然後花很長時間從頭來寫UWP版本,所以我建議將遷移的過程分階段,通過幾個版本的迭代,慢慢地從傳統桌面程式,轉變成一個可以 ...
接下來的幾篇,我想討論下遷移桌面程式到MS Store,可以採用的比較常見、通用性比較強的實施步驟和分層架構。
通常商業項目一般都是不斷的迭代,不太可能突然停止更新現有的桌面版本,然後花很長時間從頭來寫UWP版本,所以我建議將遷移的過程分階段,通過幾個版本的迭代,慢慢地從傳統桌面程式,轉變成一個可以通過MS Store審核的APPX程式。至於之後要不要變成真·UWP可以視市場反饋決定。
假設現有的桌面程式包含一個MainUI的WPF工程,多個.NET Framework 4.5的類庫,以及一個C++編寫的後臺服務,以Windows Service的形式運行。之所以假設存在一個C++的Service,是考慮有些桌面程式要和硬體打交道,只有C語言版本的API。或者需要調用公司自己的通用類庫,通常是C或C++寫的跨平臺版本。
我推薦第一步,也是最簡單的一步從.NET Framework類庫著手改起。第一階段的目標是將.NET Frramwork 4.5的類庫,轉換成.NET Standard 2.0版本的類庫。
這裡要著重介紹一下.NET Standard。MSDN上對於.NET Standard的解釋雖然每個字都認識,可把這些字連成句子,讀起來就不太容易看懂。
https://docs.microsoft.com/zh-cn/dotnet/standard/net-standard
總而言之呢,就是一個Class Library(.NET Standard),它既可以被WPF工程引用,也可以被UWP工程引用,同時還可以被.NET Core的工程引用。
在我們的例子中,因為我們的MainUI仍然是WPF的工程,所以不能直接將.NET Framework 4.5的Class Library轉換成Universal Windows版本。同時我們又需要對未來可能存在的UWP版本提供支持,那麼.NET Standard就是最佳的選擇。
在這種情況下,我們甚至可以在保留WPF的MainUI以支持Win 7(該死的老古董)的同時,新建一個UWP的UI工程來支持Win10。二者共用同一份的.NET Standard的Class Library。
可能有些同學會問,同樣一個C#的Class Library,為什麼會有.NET Framework,Universal Windows,.NET Core和.NET Standard四種類型。下麵我們來簡單介紹以上幾個概念,這些拗口的名稱得感謝某軟改名部八輩子祖宗,順便問下還招人不?
.NET Framework最為好懂,從2000年左右的.NET 1.0開始,現今已經發展到.NET 4.7.2。你說4.5以後怎麼光升小版本號啊?啥時候出.NET 5啊?我說孩子你別傻了,.NET 5不就是.NET Core嘛?
.NET Core,個人理解就是為了跨平臺,重寫的.NET Framework,也同樣是為了跨平臺,所以現階段主打ASP.NET Core,而和Windows緊密結合的WPF,Winform,甚至UWP都是暫不支持的。畢竟在短時間內,重新寫一份包含.NET 4.7.2所有功能的.NET Core不太現實。也沒有迫切的需要。從GitHub的roadmap看,至少要到3.0版本才會支持UWP及桌面開發。
https://blogs.msdn.microsoft.com/dotnet/2018/05/07/net-core-3-and-support-for-windows-desktop-applications
Universal Windows class library就比較尷尬了,作為Win8那時候的Windows Runtime portable class library的Win10升級版。技術是好技術,可惜沒趕上好時候。Win8和WP8的口碑不行,連累了Win10。簡而言之就是給所有UWP程式用的class library。
.NET Standard則是Universal Windows Class Library的跨平臺再升級版。最終的大一統,今日的主角。
上面這個表格看上去內容很多,實際我們僅僅需要看最後一列,使用最新的.NET Standard 2.0就可以了。拋去和我們遷移桌面程式關係不大的Mono,Xamarion和Unity,實際我們可以看到從.NET 4.6.1開始就已經支持.NET Standard 2.0了。從Windows 10版本來看的話,RS3的16299也已經是非常普及的版本了。
升級到.NET Standard的好處非常明顯,.NET Standard版本的類庫可以在.NET Framework,UWP和.NET Core 之間共用,同時面向未來的升級做到無縫銜接。
本著先易後難,循序漸進的原則,這一篇我們先討論了什麼是.NET Standard,以及升級的目的和意義。下一篇我們會介紹在升級.NET Framework到.NET Standard的過程中,可以使用的相容性檢測工具The .NET Portability Analyzer。順便在展望一下.NET Core 3.0,一邊寫代碼一邊吹吹水,體驗雙倍的快樂!