遷移WPF專案到.NET CORE
阿新 • • 發佈:2020-05-07
## 綜述
.NET CORE 3.0開始,桌面端支援WPF了。很多.NET FRAMEWORK的專案已經跑了一陣子了,不是很有必要支援.NET CORE,不過最近用一個程式,為了貫徹一些C# 8的特性,需要升級專案到.NET CORE 3.1。
## 方法
參考[官方指導](https://docs.microsoft.com/zh-cn/dotnet/desktop-wpf/migration/convert-project-from-net-framework),需要這麼幾步:
1. 瞭解並更新 NuGet 依賴項:
* 升級NuGet以使用格式。
* 檢視.NET Core或.NET Standard的頂級NuGet依賴項相容性。
* 將NuGet包升級到較新版本。
* 使用.NET Portability Analyzer分析依賴項。
1. 將專案檔案遷移到新的SDK樣式格式:
* 選擇是同時生成.NET Core和 .NET Framework,還是僅支援.NET Core。
* 將相關的專案檔案屬性和項複製到新專案。
2. 修復生成問題:
* 新增對Microsoft.Windows.Compatibility相容性包的引用。
* 查詢並修復API-level差異。
* 刪除app.config中appSettings和connectionStrings以外的部分。
* 如有必要,重新生成自動生成的程式碼。
3. 執行時測試:
* 確認移植的應用按預期工作。
* 注意NotSupportedException異常。
### 升級nuget引用
原來的nuget使用packages.config進行管理,.netcore已經全面使用``的形式,因此需要升級。
![升級nuget](https://img2020.cnblogs.com/blog/616093/202005/616093-20200506194418433-1191037399.png)
升級會彈出一個對話方塊提示,全部勾選上,直接升級。最後彈出一個升級報告。
### .NET Framework移植分析
VS擴充套件市場查詢並執行`.NET Portability Analyzer`以分析專案。
![img](https://img2020.cnblogs.com/blog/616093/202005/616093-20200506194418872-1763215797.png)
報告如果分析結果是
![img](https://img2020.cnblogs.com/blog/616093/202005/616093-20200506194419182-986450201.png)
這個樣子的,那就沒問題。特別關注一下.NET CORE,如果不支援,需要想想別的辦法:
1. 替換這個引用/方法
2. 升級對應的包
### 升級專案檔案
最關鍵的一步來了,需要升級專案檔案以便於支援.NET CORE。其實步驟很簡單,用vs生成一個基於.NET CORE的WPF專案,然後,直接將csproj檔案拷貝到原來的專案資料夾,使用VS新增現有專案,選擇這個檔案,可以發現原來的東西都自動新增進來了。
不過有的項不會自動處理,我們還需要手動對照一下原來的csproj檔案和新的專案csproj檔案。看看是不是缺失了一些什麼內容。
> PackageReference不會自動處理,引用的其他專案也不會,我們需要手動貼上進來。
> Resource也不會自動新增,可以使用萬用字元語法` `
> 程式的圖示需要重新新增。
編譯之後出現這個錯誤。
![img](https://img2020.cnblogs.com/blog/616093/202005/616093-20200506194419510-403423512.png)
.NET CORE程式會自動根據專案屬性生成這個資訊,如果還有AssemblyInfo.cs檔案,就會衝突。二選一解決這個問題
* 刪除assemblyinfo.cs,不過原來的csproj檔案將不可用。
* 在新專案檔案中新增`false `,禁用自動生成的功能。
### 修復生成問題
有的專案處理完畢之後還有生成錯誤,可以考慮引用`Microsoft.Windows.Compatibility`來解決一些相容性的問題。
我的專案出現了很多警告,提示專案package不相容。
![img](https://img2020.cnblogs.com/blog/616093/202005/616093-20200506194419861-150701945.png)
如果包持續有人維護的話,一般情況重新安裝一下對應的包解決這些問題。
```powershell
update-package -reinstall
```
還不行的話,那麼有概率你的程式不能正常執行。不想冒險,就需要找找替代了。
比如我手頭上的程式,引用了`CookComputing.XmlRpcV2`這個包,不支援.NET CORE,但是在網上搜索一下,可以發現`Kveer.XmlRPC`是一個移植,直接換就好了。
繼續執行,發現一直提示資原始檔錯誤,WPF的`Properties.Resources`不好用了...有幾種辦法可以解決。
1. 刪除resx檔案,將生成屬性設定為resource並使用Uri[參考](https://wpf.2000things.com/2014/07/03/1107-accessing-an-embedded-resource-using-a-uri/)
2. 刪除resx檔案,將生成屬性設定為Embedded Resource並使用整合資源[參考](https://www.cnblogs.com/ecin/archive/2012/02/26/2369139.html)
3. 刪除resx檔案,將生成屬性設定為Content並設定總是複製到目標目錄,直接讀取檔案。
## 總結
最後編譯,我這邊只有幾個警告,沒有錯誤了。鑑於程式可以正常執行,我這有空再優