摘要:最關鍵的一步來了,需要升級項目文件以便於支持.NET CORE。其實步驟很簡單,用vs生成一個基於.NET CORE的WPF項目,然後,直接將csproj文件拷貝到原來的項目文件夾,使用VS添加現有項目,選擇這個文件,可以發現原來的東西都自動添加進來了。

綜述

.NET CORE 3.0開始,桌面端支持WPF了。很多.NET FRAMEWORK的項目已經跑了一陣子了,不是很有必要支持.NET CORE,不過最近用一個程序,爲了貫徹一些C# 8的特性,需要升級項目到.NET CORE 3.1。

方法

參考 官方指導 ,需要這麼幾步:

  1. 瞭解並更新 NuGet 依賴項:
    • 升級NuGet以 使用格式。
    • 查看.NET Core或.NET Standard的頂級NuGet依賴項兼容性。
    • 將NuGet包升級到較新版本。
    • 使用.NET Portability Analyzer分析依賴項。
  2. 將項目文件遷移到新的SDK樣式格式:
    • 選擇是同時生成.NET Core和 .NET Framework,還是僅支持.NET Core。
    • 將相關的項目文件屬性和項複製到新項目。
  3. 修復生成問題:
    • 添加對Microsoft.Windows.Compatibility兼容性包的引用。
    • 查找並修復API-level差異。
    • 刪除app.config中appSettings和connectionStrings以外的部分。
    • 如有必要,重新生成自動生成的代碼。
  4. 運行時測試:
    • 確認移植的應用按預期工作。
    • 注意NotSupportedException異常。

升級nuget引用

原來的nuget使用packages.config進行管理,.netcore已經全面使用 <PackageReference> 的形式,因此需要升級。

升級會彈出一個對話框提示,全部勾選上,直接升級。最後彈出一個升級報告。

.NET Framework移植分析

VS擴展市場查找並運行 .NET Portability Analyzer 以分析項目。

報告如果分析結果是

這個樣子的,那就沒問題。特別關注一下.NET CORE,如果不支持,需要想想別的辦法:

  1. 替換這個引用/方法
  2. 升級對應的包

升級項目文件

最關鍵的一步來了,需要升級項目文件以便於支持.NET CORE。其實步驟很簡單,用vs生成一個基於.NET CORE的WPF項目,然後,直接將csproj文件拷貝到原來的項目文件夾,使用VS添加現有項目,選擇這個文件,可以發現原來的東西都自動添加進來了。

不過有的項不會自動處理,我們還需要手動對照一下原來的csproj文件和新的項目csproj文件。看看是不是缺失了一些什麼內容。

PackageReference不會自動處理,引用的其他項目也不會,我們需要手動粘貼進來。

Resource也不會自動添加,可以使用通配符語法 <Resource Include="Images\*.png" />

編譯之後出現這個錯誤。

.NET CORE程序會自動根據項目屬性生成這個信息,如果還有AssemblyInfo.cs文件,就會衝突。二選一解決這個問題

<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

修復生成問題

有的項目處理完畢之後還有生成錯誤,可以考慮引用 Microsoft.Windows.Compatibility 來解決一些兼容性的問題。

我的項目出現了很多警告,提示項目package不兼容。

如果包持續有人維護的話,一般情況重新安裝一下對應的包解決這些問題。

update-package -reinstall

還不行的話,那麼有概率你的程序不能正常運行。不想冒險,就需要找找替代了。

比如我手頭上的程序,引用了 CookComputing.XmlRpcV2 這個包,不支持.NET CORE,但是在網上搜索一下,可以發現 Kveer.XmlRPC 是一個移植,直接換就好了。

繼續運行,發現一直提示資源文件錯誤,WPF的 Properties.Resources 不好用了...有幾種辦法可以解決。

  1. 刪除resx文件,將生成屬性設置爲resource並使用Uri 參考
  2. 刪除resx文件,將生成屬性設置爲Embedded Resource並使用集成資源參考
  3. 刪除resx文件,將生成屬性設置爲Content並設置總是複製到目標目錄,直接讀取文件。

總結

最後編譯,我這邊只有幾個警告,沒有錯誤了。鑑於程序可以正常運行,我這有空再優化吧。

相關文章