本文概述將程式代碼從 .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.dll 或 kernel32.dll,則程式代碼只能在 Windows 上運作。 針對您想要讓應用程式執行的每個平臺,您必須尋找平臺特定版本,或讓您的程式代碼泛型足以在所有平台上執行。
當您將應用程式從 .NET Framework 移植到 .NET 時,您的應用程式可能會使用 .NET Framework 所提供的連結庫。 許多 .NET Framework 中提供的 API 並未移植到 .NET,因為它們依賴 Windows 特定技術,例如 Windows 登錄或 GDI+ 繪圖模型。
Windows 相容性套件會將 .NET Framework API 介面的大部分提供給 .NET,並透過 Microsoft.Windows.Compatibility NuGet 套件提供。
如需詳細資訊,請參閱 使用 Windows 相容性套件將程式代碼移植到 .NET。
.NET Framework 相容性模式
.NET Standard 2.0 中引進了 .NET Framework 兼容性模式。 相容性模式可讓 .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 版本的單詞搭配使用。 例如,.NET Framework 4.7.2 看起來像下列代碼段:
<PropertyGroup>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
</PropertyGroup>
SDK 樣式專案使用不同的屬性來識別目標架構、 <TargetFramework>
屬性。 當以 .NET Framework 為目標時,Moniker 會以 net
開頭,並以不含任何句點的 .NET Framework 版本作為結尾。 例如,以 .NET Framework 4.7.2 為目標的名稱是 net472
:
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
如需所有目標Moniker的清單,請參閱 SDK樣式專案中的目標架構。
無法使用的技術
.NET Framework 中有一些技術不存在於 .NET 中:
-
不支援建立其他應用程式域。 針對程式代碼隔離,請使用個別的進程或容器做為替代方案。
-
遠端處理用於跨不再支援的應用程式域進行通訊。 針對跨進程的簡單通訊,請考慮跨進程通訊 (IPC) 機制作為遠端處理的替代方式,例如 System.IO.Pipes 類別或 MemoryMappedFile 類別。 針對更複雜的案例,請考慮 StreamJsonRpc 或 ASP.NET Core 等架構(使用 gRPC 或 RESTful Web API 服務)。
因為不支援遠端調用,因此呼叫委派物件上的
BeginInvoke()
和EndInvoke()
時,將會拋出PlatformNotSupportedException
。 -
CAS 是 .NET Framework 支援的沙盒化技術,但在 .NET Framework 4.0 中已被取代。 它已由安全性透明度所取代,且 .NET 中不支援它。 請改用操作系統所提供的安全性界限,例如虛擬化、容器或用戶帳戶。
-
與 CAS 類似,.NET Framework 應用程式不再建議使用安全性透明度沙盒化技術,而且 .NET 不支援。 請改用操作系統所提供的安全性界限,例如虛擬化、容器或用戶帳戶。
-
System.EnterpriseServices .NET 不支援 (COM+)。
Windows Workflow Foundation (WF)
.NET 不支援 WF。 如需替代方案,請參閱 CoreWF。
如需這些不支援技術的詳細資訊,請參閱 .NET 6+ 上無法使用的 .NET Framework 技術。
跨平臺
.NET(先前稱為 .NET Core)是設計成跨平臺。 如果您的程式代碼不依賴 Windows 特定技術,它可以在其他平台上執行,例如 macOS、Linux 和 Android。 這類程式代碼包含項目類型,例如:
- 圖書館
- 命令列工具
- 自動化
- ASP.NET 網站
.NET Framework 是僅限 Windows 的元件。 當您的程式代碼使用 Windows 特定技術或 API,例如 Windows Forms 和 WPF 時,程式代碼仍然可以在 .NET 上執行,但不會在其他作系統上執行。
您的程式庫或控制台應用程式可以跨平台使用,幾乎不需變更。 當您移植到 .NET 時,可能會想要將此納入考慮,並在其他平台上測試您的應用程式。
.NET Standard 的未來
.NET Standard 是多個 .NET 實作中提供的 .NET API 的正式規格。 .NET Standard 背後的動機是在 .NET 生態系統中建立更高的一致性。 從 .NET 5 開始,已採用不同的建立統一性方法,而且這個新方法可在許多案例中消除 .NET Standard 的需求。 如需詳細資訊,請參閱 .NET 5+ 和 .NET Standard。
.NET Standard 2.0 是支援 .NET Framework 的最後一個版本。
協助移植的工具
您可以使用不同的工具來協助將移轉的某些層面自動化,而不是手動將應用程式從 .NET Framework 移植到 .NET。 將複雜的專案移植本身就是一個複雜的過程。 這些工具可能有助於該旅程。
即使您使用工具來協助移植應用程式,您也應該檢閱本文中 移植時的考慮一節 。
.NET 升級小幫手
.NET Upgrade Assistant 是命令行工具,可在不同類型的 .NET Framework 應用程式上執行。 其設計目的是協助將 .NET Framework 應用程式升級至 .NET。 執行此工具之後, 在大部分情況下,應用程式將需要更多工作才能完成移轉。 此工具包含可協助完成移轉的分析器安裝。 此工具適用於下列 .NET Framework 應用程式類型:
- Windows Forms
- WPF(Windows Presentation Foundation)
- ASP.NET MVC
- 控制台
- 類別庫
此工具會使用本文中列出的其他工具,例如 try-convert,並引導移轉程式。 如需此工具的詳細資訊,請參閱 .NET 升級小幫手概觀。
try-convert
此工具 try-convert
是 .NET 全域工具,可將專案或整個解決方案轉換成 .NET SDK,包括將傳統型應用程式移至 .NET。 不過,如果您的專案具有複雜的建置程式,例如自定義工作、目標或匯入,則不建議使用此工具。
如需詳細資訊,請參閱 GitHub 存放try-convert
庫。
平台相容性分析器
平臺相容性分析器會分析您是否使用在運行時間擲回 PlatformNotSupportedException 的 API。 雖然從 .NET Framework 4.7.2 或更高版本升級時,找到這些 API 的可能性不大,但最好還是檢查一下。 如需在 .NET 上擲回例外狀況之 API 的詳細資訊,請參閱 一律在 .NET Core 上擲回例外狀況的 API。
如需詳細資訊,請參閱平台相容性分析器。
移植時的考慮
將應用程式移植到 .NET 時,請依序考慮下列建議:
✔️ 請考慮使用 .NET 升級小幫手 移轉專案。 雖然此工具處於預覽狀態,但它仍會自動執行本文中詳述的大部分手動步驟,並提供您繼續移轉路徑的絕佳起點。
✔️ 請考慮先檢查相依性。 您的相依性必須以 .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) 版本。
✔️ DO 以 Windows Forms 和 WPF 專案的 .NET 6+ 為目標。 .NET 6 和後續版本包含許多桌面應用程式的改進。
✔️ 如果您要移轉可能也搭配 .NET Framework 專案使用的函式庫,請考慮以 .NET Standard 2.0 為目標。 您也可以讓您的程式庫支援多個目標,針對 .NET Framework 和 .NET Standard 進行開發。
在移轉後若收到遺漏 API 的錯誤訊息,請添加 Microsoft.Windows.Compatibility NuGet 套件 參考。 大部分的 .NET Framework API 介面可透過 NuGet 套件提供給 .NET。