共用方式為


從 .NET Framework 移植到 .NET 的概觀

本文提供將程式碼從 .NET Framework 移植至 .NET (先前稱為 .NET Core) 時應考慮的概觀。 對於許多專案來說,從 .NET Framework 移植到 .NET 相對簡單。 專案的複雜性決定了在專案檔案初始升級後需要執行多少工作。

在 .NET 中提供應用程式模型的專案,例如程式庫、主控台應用程式和傳統型應用程式,通常不需要變更。 需要新應用程式模型的專案 (例如 從 ASP.NET 移至 ASP.NET Core) 需要更多工作。 舊應用程式模型中的許多模式都有可在轉換期間使用的對等模式。

Windows 桌面技術

許多針對 .NET Framework 建立的應用程式都使用桌面技術,例如 Windows Forms 或 Windows Presentation Foundation (WPF)。 Windows Forms 和 WPF 都可以在 .NET 中使用,但它們仍然是僅限 Windows 的技術。

在升級 Windows Forms 或 WPF 應用程式之前,請先考慮下列相依性:

  • .NET 的專案檔案使用與 .NET Framework 不同的格式。
  • 您的專案可能會使用 .NET 中無法使用的 API。
  • 協力廠商控制項和程式庫可能尚未移植至 .NET,而且只能供 .NET Framework 使用。
  • 您的專案使用 .NET 中 不再可用的技術

.NET 使用 Windows Forms 和 WPF 的開放原始碼版本,並包含 .NET Framework 的增強功能。

如需將桌面應用程式升級至 .NET 的教學課程,請參閱下列其中一篇文章:

Windows 特定 API

應用程式仍然可以在 .NET 支援的平臺上 P/Invoke 原生程式庫。 這項技術不僅限於 Windows。 但是,如果您引用的庫是特定於 Windows 的,例如 user32.dllkernel32.dll,則該代碼僅適用於 Windows。 對於您希望應用程式執行的每個平台,您必須找到特定於平台的版本,或使您的程式碼足夠通用以在所有平台上運行。

當您將應用程式從 .NET Framework 移植到 .NET 時,您的應用程式可能使用 .NET Framework 提供的程式庫。 許多 .NET Framework 中可用的 API 都未移植至 .NET,因為它們依賴 Windows 特定技術,例如 Windows 登錄或 GDI+ 繪圖模型。

Windows 相容性套件會為 .NET 提供大部分 .NET Framework API 介面,並透過 Microsoft.Windows.Compatibility NuGet 套件提供。

如需詳細資訊,請參閱 使用 Windows 相容元件將程式碼移植至 .NET

.NET Framework 相容模式

.NET Framework 相容模式是在 .NET Standard 2.0 中引進的。 相容性模式可讓 .NET Standard 和 .NET 專案參考 .NET Framework 程式庫,就像針對專案的目標架構編譯一樣。 不過,某些 .NET 實作可能支援比其他實作更大的 .NET Framework 區塊。 例如,.NET Core 3.0 會將 .NET Framework 相容性模式延伸至 Windows Forms 和 WPF。 參考 .NET Framework 程式庫不適用於所有專案,例如程式庫使用 WPF API,但它確實會解除封鎖許多移植案例。 如需詳細資訊,請參閱分析 相依性以將程式碼從 .NET Framework 移植到 .NET

參考 .NET Framework 程式庫並非在所有情況下都有效,因為這取決於使用了哪些 .NET Framework API,以及專案的目標架構是否支援這些 API。 此外,某些 .NET Framework API 只能在 Windows 上運作。 .NET Framework 相容性模式會解除封鎖許多移植案例,但您應該測試專案,以確保它們在執行階段也能運作。 如需詳細資訊,請參閱分析 相依性以將程式碼從 .NET Framework 移植到

SDK 樣式專案中的目標架構變更

如先前所述,.NET 的專案檔案使用與 .NET Framework 不同的格式,稱為 SDK 樣式專案格式。 即使您未從 .NET Framework 移至 .NET,您仍應該將專案檔升級為最新格式。 在SDK樣式的專案中,指定目標框架的方式是不同的。 在 .NET Framework 中,屬性 <TargetFrameworkVersion> 會與指定 .NET Framework 版本的 Moniker 搭配使用。 例如,.NET Framework 4.7.2 看起來像下列程式碼片段:

<PropertyGroup>
  <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
</PropertyGroup>

SDK 樣式專案會使用不同的屬性來識別目標架構,即 <TargetFramework> 屬性。 以 .NET Framework 為目標時,標識符會以 net 開頭,並以沒有任何句點的 .NET Framework 版本結尾。 例如,以 .NET Framework 4.7.2 為目標的 moniker 為 net472

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>

如需所有目標 Moniker 的清單,請參閱 SDK 樣式專案中的目標架構

無法使用的技術

.NET Framework 中有一些技術不存在於 .NET 中:

  • 應用程式網域

    不支援建立其他應用程式網域。 對於程式碼隔離,請使用單獨的進程或容器作為替代方案。

  • 遠端通訊

    遠端處理可用來跨應用程式網域進行通訊,而這些網域不再受支援。 若要針對跨進程的簡單通訊,請考慮進程間通訊 (IPC) 機制作為遠端處理的替代方案,例如 System.IO.Pipes 類別或 MemoryMappedFile 類別。 對於更複雜的案例,請考慮 StreamJsonRpcASP.NET Core 等架構 (使用 gRPCRESTful Web API 服務)。

    因為不支援遠端處理,因此對委派物件進行 BeginInvoke()EndInvoke() 呼叫時會擲回 PlatformNotSupportedException

  • 程式碼存取安全性 (CAS)

    CAS 是 .NET Framework 支援的沙箱技術,但在 .NET Framework 4.0 中已被取代。 它已由安全性透明度取代,而且 .NET 不支援。 相反地,請使用作業系統提供的安全界限,例如虛擬化、容器或使用者帳戶。

  • 安全透明度

    與 CAS 類似,不再建議將安全性透明度沙箱技術用於 .NET Framework 應用程式,而且 .NET 不支援它。 相反地,請使用作業系統提供的安全界限,例如虛擬化、容器或使用者帳戶。

  • System.EnterpriseServices

    System.EnterpriseServices .NET 不支援 (COM+) 。

  • Windows Workflow Foundation (WF)

    .NET 不支援 WF。 如需替代方案,請參閱 CoreWF

如需這些不支援技術的詳細資訊,請參閱 .NET 6+ 上無法使用的 .NET Framework 技術

跨平台

.NET (先前稱為 .NET Core) 設計為跨平台。 如果您的程式碼不依賴於 Windows 特定的技術,它可以在其他平台上運行,例如 macOS、Linux 和 Android。 這類程式碼包括專案類型,例如:

  • 圖書館
  • 以控制台為基礎的工具
  • Automation
  • ASP.NET 站點

.NET Framework 是僅限 Windows 的元件。 當您的程式碼使用 Windows 特定的技術或 API (例如 Windows Forms 和 WPF) 時,程式碼仍然可以在 .NET 上執行,但無法在其他作業系統上執行。

您的程式庫或主控台型應用程式可以跨平台使用,而不需要進行太多變更。 當您移植到 .NET 時,您可能想要考慮這一點,並在其他平台上測試您的應用程式。

.NET Standard 的未來

.NET Standard 是 .NET API 的正式規格,可在多個 .NET 實作上使用。 .NET Standard 背後的動機是在 .NET 生態系統中建立更大的一致性。 從 .NET 5 開始,已採用不同的方法來建立統一性,而這種新方法在許多案例中都不需要 .NET Standard。 如需詳細資訊,請參閱 .NET 5+ 和 .NET Standard

.NET Standard 2.0 是支援 .NET Framework 的最後一個版本。

協助移植的工具

您可以使用不同的工具來協助自動化升級的某些層面,而不是手動將應用程式從 .NET Framework 移植到 .NET。 移植一個複雜的項目本身就是一個複雜的過程。 這些工具可能會在這段旅程中有所幫助。

即使您使用工具來協助移植應用程式,也應該檢閱本文中的移植 時的考量一節

GitHub Copilot 應用程式現代化助手

GitHub Copilot 應用程式現代化 是 GitHub Copilot 聊天小幫手,可協助您規劃專案並將其升級至較新版本的 .NET、移轉至 Azure、更新相依性,以及套用程式碼修正。 Azure 移轉是由 .NET 的應用程式和程式碼評定所提供

此聊天小幫手支援下列升級路徑:

  • 將專案從舊版 .NET 升級至最新版本。
  • 將專案從 .NET Framework 升級至最新版本的 .NET。
  • 使用新功能將程式碼庫現代化。
  • 將元件和服務移轉至 Azure。

它也適用於各種專案類型,例如:

  • ASP.NET 和相關技術,例如MVC、Razor頁面、Web API
  • Blazor
  • Azure Functions
  • Windows Presentation Foundation
  • Windows Forms
  • 類別庫
  • 主控台應用程式

使用時機:

當您想要 AI 支援的端對端體驗,將 .NET Framework 專案和相依性升級至新式 .NET 時,請使用 GitHub Copilot 應用程式現代化,涵蓋將應用程式移轉至 Azure 的評量、規劃、補救和指引。

.NET 的應用程式和程式碼評定

適用於 .NET 的 Azure Migrate 應用程式和程式代碼評定 提供程式代碼和應用程式分析,以及規劃雲端部署的建議。 它透過提供以開發人員為中心的原始程式碼評估,幫助您自信地在雲端中執行關鍵業務解決方案。 此工具也提供建議和範例,以遵循業界最佳做法,以最佳化 Azure 的程式碼和設定。

此工具也用於 GitHub Copilot 應用程式對 .NET 體驗的現代化改造。

使用時機:

使用 Azure Migrate 應用程式和 .NET 程式代碼評定工具集,以評估將現有的程式代碼基底移轉至 Azure 並提出建議。 Azure Migrate 應用程式和程式代碼評定基本上是 .NET 體驗的 GitHub Copilot 應用程式現代化的子集。

.NET 升級小幫手

.NET 升級小幫手是一種命令列工具,可以在不同類型的 .NET Framework 應用程式上執行。 它旨在協助將 .NET Framework 應用程式升級至 .NET。 運行該工具後, 在大多數情況下,應用程序將需要更多努力才能完成升級。 該工具包括安裝分析器,以協助完成升級。 此工具適用於下列類型的 .NET Framework 應用程式:

  • Windows Forms
  • WPF
  • ASP.NET MVC
  • Console
  • 類別庫

此工具會使用本文中列出的其他工具,例如 try-convert,並引導升級程式。 如需工具的詳細資訊,請參閱 .NET 升級小幫手概觀

使用時機:

當 GitHub Copilot 應用程式現代化等 AI 支援的解決方案無法使用時使用。

try-convert

try-convert 工具是一個 .NET 全域工具,可以將項目或整個解決方案轉換為 .NET SDK,包括將傳統型應用程序移動到 .NET。 不過,如果您的專案具有複雜的建置程式,例如自訂工作、目標或匯入,則不建議使用此工具。

如需詳細資訊,請參閱 try-convert GitHub 存放庫

平台相容性分析器

平台相容性分析器會分析你是否使用會在執行時拋出 的 PlatformNotSupportedException API。 雖然如果您要從 .NET Framework 4.7.2 或更新版本移轉,則不太可能找到其中一個 API,但最好檢查一下。 如需在 .NET 上擲回例外狀況的 API 的詳細資訊,請參閱 一律在 .NET Core 上擲回例外狀況的 API

如需詳細資訊,請參閱 平台相容性分析器

移植時的考量

將應用程式移植至 .NET 時,請依序考慮下列建議:

✔️ 考慮使用 GitHub Copilot 應用程式現代化 來升級您的專案。 GitHub Copilot 在移植時識別和修復不相容方面功能強大。 它可自動執行本文中詳述的大部分手動步驟,並為您提供繼續升級路徑的絕佳起點。

✔️ 考慮先檢查您的依賴項。 您的相依性必須以 .NET、.NET Standard 或 .NET Core 為目標。

✔️ 請從 NuGet packages.config 檔案升級至 PackageReference 專案檔中的設定。 使用 Visual Studio 轉換package.config檔案

✔️ 即使您還無法移植應用程式,也請考慮升級至最新的專案檔案格式。 .NET Framework 專案使用過時的專案格式。 雖然最新的專案格式 (稱為 SDK 樣式專案) 是針對 .NET Core 及更新版本所建立,但該格式也適用於 .NET Framework。 將專案檔案採用最新格式,可為日後移植應用程式奠定良好的基礎。

✔️ 請將您的 .NET Framework 專案重新定位為至少 .NET Framework 4.7.2。 這可確保 .NET Standard 不支援現有 API 的情況下,提供最新的 API 替代方案。

✔️ 請考慮以 .NET 8 為目標,這是長期支援 (LTS) 版本。

✔️ 請針對 Windows Forms 和 WPF 專案以 .NET 8+ 為目標。 .NET 8 和後續版本包含桌面應用程式的許多改善。

✔️ 如果您要升級也可能與 .NET Framework 專案搭配使用的程式庫,請考慮以 .NET Standard 2.0 為目標。 您也可以讓您的程式庫同時針對 .NET Framework 和 .NET Standard 進行多重目標設定。

✔️ 如果在遷移之後,收到遺漏 API 的錯誤,請新增 Microsoft.Windows.Compatibility NuGet 套件 的參考。 .NET Framework API 介面的大部分可透過 NuGet 套件提供給 .NET。

另請參閱