.NET Core 3.1 已經使用很長一段時間,其實在 2022 年底微軟就不再提供支援,後續的 LTS 版本 .NET 6 也會在 2024 年 11 月終止支援,因此直接升級到 .NET 8 是最好的選擇。
微軟官方推出了升級工具:Upgrade Assistant 。
有了升級工具,升級就變得非常簡單,本文將介紹如何使用升級工具將 .NET Core 3.1 專案升級到 .NET 8。
安裝 Upgrade Assistant
先確保 VS2022 已經升級到 17.8。然後在 VS2022 的擴充功能管理中安裝擴充功能:.NET Upgrade Assistant,需要特別注意的是,如果之前安裝過升級工具擴充功能,需要解除安裝後重新安裝。

升級專案
.NET Core 3.1 的一個解決方案中,會有很多專案,依照專案的相依關係,從最底層的專案逐個往上進行升級。
- 安裝完升級工具後,在專案上按右鍵就會出現 Upgrade 按鈕:

- 在彈窗中選擇升級方式:

- 選擇升級的目標版本,這裡我選擇 .NET 8,這是一個長期支援版本,最新版本的升級工具只支援升級到 7 和 8 了,如果有升級到 .NET 6 的需求,就需要使用舊版本:

- 選擇需要更新的內容,預設全選,點擊「Upgrade selection」進行升級:

- 很快就可以看到升級成功的提示:

編譯
我驗證過好幾個低版本的專案,使用工具升級的過程沒有出現任何錯誤,但升級完後進行程式碼編譯就會出現各種問題了。
問題 1:Ionic.zip
在原本的版本中,專案中的 zip 壓縮用到了 Ionic.zip,現在 .NET8 已經不支援了,需要換成 DotNetZip:

問題 2:BinaryFormatter 已經過時
程式碼中有不少地方使用到二進位序列化,但 BinaryFormatter 在 .NET8 中已經棄用,有兩種解決方式:
修改原始碼,採用新的建議方式進行取代。
修改專案檔案,忽略此問題,在專案檔案中新增以下設定:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0011</NoWarn>
</PropertyGroup>
</Project>
參考:https://learn.microsoft.com/zh-tw/dotnet/fundamentals/syslib-diagnostics/syslib0011
問題 3:Aspose 使用問題
專案中對 Office 檔案的處理,使用了 Aspose 套件,升級後版本有相容性問題,升級到對應的版本即可。

問題 4:方法歧義性
在之前的版本中,List 儲存的如果是一個複雜型別,想要依照型別中的某個欄位進行去重沒辦法直接實現:
List<UserInfo> list = new List<UserInfo>();
list.Add(new UserInfo() { Name="oec2003",Age=18});
list.Add(new UserInfo() { Name = "oec2003" ,Age=18});
list.Add(new UserInfo() { Name = "oec2004" ,Age=18});
list.Add(new UserInfo() { Name = "oec2004" ,Age=18});
var distnctList = list.DistinctBy(x=>x.Age);
foreach (var item in distnctList)
{
Console.WriteLine(item.Name);
}
public class UserInfo
{
public string Name { get; set; }
public int Age { get; set; }
}
上面程式碼中的 DistinctBy 方法在 .NET Core 3.1 中並沒有,所以我們擴充了一個 DistinctBy 方法,沒想到 .NET8 中已經預設提供,會導致方法衝突,只需要將我們的擴充方法移除,使用預設即可。

執行
解決了上面的幾個編譯問題後,程式就能正常啟動執行了,整個過程非常快速,不得不說,微軟的技術向下相容做得非常不錯,再加上工具的加持,升級到新版本沒有什麼壓力和負擔。
相比之下,其他有些技術雖然也在不斷更新迭代,但主流使用的還是某個特定版本。