使用 .NET 升級助手將.NET Framework應用遷移到.NET 5

張善友發表於2021-05-29

從.NET Framework 遷移到.NET 5 猶如搬家,我們都知道搬家是很痛苦的,我們請求搬家公司來減輕我們的壓力,.NET 升級助手 的作用就類似我們聘請的搬家公司,幫助我們處理繁重乏味的遷移工作。.NET 升級助手是一個全域性命令列工具,可以指導你將.NET Framework應用程式遷移到.NET  5, 在這個遷移過程中自動執行幾個步驟。.NET升級助手的程式碼: https://github.com/dotnet/upgrade-assistant/

如果我們的.NET Framework應用程式本身年齡夠大,是一座屎山難以修復,.NET 5確是一種採用當今最先進材料構建的現代綠色住宅,.NET 升級助手 能讓我們的遷移工作輕鬆一些,它也不是萬能的,沒辦法幫助我們把系統搞的更好,在我們遷移的過程中還是需要進行一些手動工作的。

.NET 升級助手是一款可以在不同型別的 .NET Framework 應用上執行的命令列工具。 它旨在幫助將 .NET Framework 應用升級到 .NET 5。 在執行此工具後,大多數情況下,應用將需要更多操作才能完成遷移。 此工具會安裝可以幫助完成遷移的分析器。

它執行下列任務:

  • 新增有助於升級的分析器
  • 確定要升級的專案以及升級順序
  • 將你的專案檔案更新為 SDK 格式
  • 將你的專案重新定位到 .NET 5
  • 將 NuGet 包依賴項更新為與 .NET 5 相容的版本,並刪除存在於 .NET 5 中的傳遞依賴項 packages.config
  • 進行 C# 更新以使用其 .NET 5 等效項替換 .NET Framework 模式
  • 在適當的地方,新增通用模板檔案

該工具目前支援下列 .NET Framework 應用型別:

  • .NET Framework Windows 窗體應用
  • .NET Framework WPF 應用
  • .NET Framework ASP.NET MVC 應用
  • .NET Framework 控制檯應用
  • .NET Framework 類庫

我們將通過遷移執行 .NET Framework 4.7.2的版本的 ASP.NET MVC 應用eShopLegacyMVCSolution來評估 .NET 升級助手.

我們使用從電子書“使用 Azure 雲和 Windows 容器現代化現有 .NET 應用程式” 的程式碼  https://github.com/dotnet-architecture/eShopModernizing

準備工作

在開始使用升級助手之前,請確保您熟悉 Microsoft 的移植文件並瞭解遷移限制,尤其是在遷移 ASP.NET 應用程式時。此外,您首先使用.NET Portability Analyzer 工具來了解哪些依賴項支援 .NET 5。 這就像在搬家之前打電話給搬家公司瞭解他們是否可以搬家和不搬家以及可能需要多長時間。

在安裝 .NET 升級助手之前,您必須確保安裝好下列工具:

該工具還依賴於try-convert將專案檔案轉換為 SDK 格式的工具。您必須有版本0.7.212201或更高版本才能使用升級助手。

在命令列下執行以下命令以安裝 .NET 升級助手。(它是一個全域性工具,因此您可以在任何地方執行該命令。)

dotnet tool install -g try-convert

如果已經安裝try-convert但需要升級到較新版本,請執行以下命令:

dotnet tool update -g try-convert

安裝 .NET 升級助手

我們現在已準備好安裝 .NET 升級助手。為此,請從終端執行以下命令:

dotnet tool install -g upgrade-assistant
安裝 .NET 升級助手後,切換到解決方案所在的資料夾並輸入以下命令來執行它。
upgrade-assistant upgrade <MySolution.sln>

使用升級助手遷移到 .NET 5

首先,我將從我的終端執行以下命令。(預設命令就可以工作,但是,如果需要,您可以傳遞其他引數,例如--verbose.)

upgrade-assistant upgrade eShopDotNet5MVC.sln
該工具執行並向我們顯示它將執行的步驟。對於流程中的每個步驟,我們可以應用流程中的下一步、跳過它、檢視詳細資訊或配置日誌記錄。大多數情況下,您需要選擇Apply next step。為了節省一些時間,您可以按回車來執行此操作。
image
當該工具啟動時,它會在專案的根目錄中放置一個日誌檔案log.txt
第一步是備份專案。.NET 升級助手會詢問您是要為備份使用自定義路徑還是預設位置。完成後,我們就可以轉換專案檔案了。
第二步是將專案檔案轉換為 SDK 樣式,.NET 5 專案使用的是 SDK 格式。在此步驟中,升級助手使用該ry-convert工具將你的專案檔案轉換為該 SDK 格式。在此過程中,我們看到該工具警告我們一些匯入,如System.Web遷移後可能需要手動干預。

image

第三步是清理Nuget包的引用關係

image

第四步是更新TFM,.NET 升級助手會將目標框架名稱 (TFM) 更新為 .NET 5.0。在我的情況下,值從net472更改為net5.0。

image

第五步是更新 NuGet 包,升級助手更新 TFM 後,它會嘗試更新專案的 NuGet 包。該工具使用分析器來檢測要刪除的引用以及要使用.NET 5版本升級的軟體包。然後,該工具更新包。

image

第六步是新增模板檔案,該工具更新任何 NuGet 包後,它會新增任何相關模板檔案。ASP.NET Core 使用模板檔案進行配置和啟動。這通常包括Program.csStartup.csappsettings.jsonappsettings.development.json

image

第七步是遷移應用程式配置檔案,現在升級助手已準備好遷移我們的應用程式配置檔案。該工具確定支援哪些設定,然後將任何可配置的設定遷移到我的appSettings.json檔案中。完成後,該工具system.web.webPages.razor/pages/namespaces通過_ViewImports.cshtml使用對 的@addTagHelper引用進行更新來遷移Microsoft.AspNetCore.Mvc.TagHelpers

image

第八步是更新Razor 檔案,修復Razor 檔案裡面的程式碼

第九步是更新 C# 原始碼,.NET升級助手將C#程式碼引用升級到其.NET Core 版本。您會在終端中看到列出的幾個步驟 - 並非所有步驟都適用。在這些情況下,它們將被跳過並標記為[Complete].

就這個例子來說,該步驟首先刪除任何using引用 .NET Framework 名稱空間的語句,例如System.Web. 然後,它確保我的ActionResult呼叫來自Microsoft.AspNetCore.Mvc名稱空間。最後,升級助手確保我不使用ASP.NET Core 不支援的HttpContext.Current

image

image

最後一步是評估下一個專案。由於我們的解決方案只有一個專案,因此該工具退出。

image

現在工具已經幫我們完成大部分的遷移工作了,最後一步就是要我們手動修復剩餘的問題了。仍然需要整理一些東西。大多數這些問題涉及 ASP.NET Core 如何處理啟動、配置和捆綁。

  • 在ASP.NET Core不再需要Global.asaxGlobal.asax.cs檔案, ASP.NET Core的Startup.cs 依賴注入模式替換了全球應用程式事件模型
  • 您不需要的App_Start資料夾或其中的任何檔案(BundleConfig.csFilterConfig.csRouteConfig.cs),繼續把它刪除了。
  • 執行此操作後,您剩下的大部分錯誤都與靜態資源的捆綁有關。ASP.NET Core 可與多種捆綁解決方案配合使用。閱讀捆綁文件並選擇最適合您的專案的方法。
  • 最後,解決任何仍然存在的問題。這個示例的變化很小。例如,在我的_Layout.cshtml檔案中,我們必須注入一個IHttpContextAccessor來訪問HttpContext.Session並且我還需要清理一些ActionResult響應。

雖然升級助手可以滿足您的大部分用例,但它有一個可選的輔助功能模型,允許您自定義升級步驟,而無需自己修改工具。例如,您可以將NuGet軟體包顯式對映到其替換版本,新增自定義模板檔案並新增自定義升級步驟。

首先,您將包含一個ExtensionManifest.json檔案,該檔案定義工具在何處找到不同的擴充套件項。您需要一個清單,但以下所有元素都是可選的,因此您可以僅定義您需要的內容,具體請參考文件 https://github.com/dotnet/upgrade-assistant/blob/main/docs/extensibility.md

相關文章