接下來的幾篇,我想討論下遷移桌面程序到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版本的類庫。windows
這裏要着重介紹一下.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的跨平臺再升級版。最終的大一統,今日的主角。app
上面這個表格看上去內容不少,實際咱們僅僅須要看最後一列,使用最新的.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,一邊寫代碼一邊吹吹水,體驗雙倍的快樂!工具