.NET Core 3.1 升級到 .NET 8

.NET Core 3.1 升級到 .NET 8

.NET Core 3.1 已經用了很長一段時間,其實在 2022 年的年底微軟已經不提供支援了,後面的 LTS 版本 .NET 6 也會在 2024 年 11 月終止支援,所以直接升級到 .NET 8 是最好的選擇。

最後更新 2023/12/8 上午5:27
不止dotNET
預計閱讀 4 分鐘
分類
.NET
標籤
.NET C# 技術更新

.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 的一個解決方案中,會有很多專案,依照專案的相依關係,從最底層的專案逐個往上進行升級。

  1. 安裝完升級工具後,在專案上按右鍵就會出現 Upgrade 按鈕:

圖片

  1. 在彈窗中選擇升級方式:

圖片

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

圖片

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

圖片

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

圖片

編譯

我驗證過好幾個低版本的專案,使用工具升級的過程沒有出現任何錯誤,但升級完後進行程式碼編譯就會出現各種問題了。

問題 1:Ionic.zip

在原本的版本中,專案中的 zip 壓縮用到了 Ionic.zip,現在 .NET8 已經不支援了,需要換成 DotNetZip:

圖片

問題 2:BinaryFormatter 已經過時

程式碼中有不少地方使用到二進位序列化,但 BinaryFormatter 在 .NET8 中已經棄用,有兩種解決方式:

  1. 修改原始碼,採用新的建議方式進行取代。

  2. 修改專案檔案,忽略此問題,在專案檔案中新增以下設定:

<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 中已經預設提供,會導致方法衝突,只需要將我們的擴充方法移除,使用預設即可。

圖片

執行

解決了上面的幾個編譯問題後,程式就能正常啟動執行了,整個過程非常快速,不得不說,微軟的技術向下相容做得非常不錯,再加上工具的加持,升級到新版本沒有什麼壓力和負擔。

相比之下,其他有些技術雖然也在不斷更新迭代,但主流使用的還是某個特定版本。

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2026/2/7

AOT使用經驗總結

從專案建立伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 AOT 發布測試。

繼續閱讀