.NET 上無法使用的 .NET Framework 技術

.NET 6+ 無法使用可供 .NET Framework 程式庫使用的數種技術,例如,應用程式網域、遠端處理,以及程式碼存取安全性 (CAS)。 如果您的程式庫依賴此頁面所列的一或多個技術,請考慮所提及的替代方法。

如需 API 相容性的詳細資訊,請參閱 .NET 中的中斷性變更 (部分機器翻譯)。

應用程式網域

應用程式定義域 (AppDomain) 可將應用程式互相隔離。 AppDomain 需要執行階段支援,且資源成本較高。 不支援建立更多應用程式定義域,而且未來不打算新增此功能。 若要隔離程式碼,請使用不同的處理序或容器作為替代方案。 若要動態載入組件,請使用 AssemblyLoadContext (部分機器翻譯) 類別。

為了讓從 .NET Framework 移轉程式碼更加輕鬆,.NET 6+ 會公開部分 AppDomain API 介面。 某些 API 會正常運作 (例如 AppDomain.UnhandledException),某些成員不會執行任何動作 (例如 SetCachePath),而其中某些會擲回 PlatformNotSupportedException (例如 CreateDomain)。 檢查您針對 dotnet/runtime GitHub 存放庫 (英文) 中的 System.AppDomain 參考來源 (英文) 使用的類型。 請務必選取符合您已實作版本的分支。

遠端

.NET 6+ 上不支援 .NET 遠端處理。 .NET 遠端處理已被識別為有問題的架構。 其用於跨不再支援的應用程式定義域進行通訊。 此外,遠端處理需要執行階段支援,因此維護成本相當高昂。

如需跨處理序的簡易通訊,請考慮使用處理序間通訊 (IPC) 機制代替遠端處理,例如 System.IO.Pipes (部分機器翻譯) 類別或 MemoryMappedFile (部分機器翻譯) 類別。 針對更複雜的案例,開放原始碼 StreamJsonRpc (英文) 專案提供跨平台 .NET Standard 遠端處理架構,可在現有串流或管道連線上運作。

針對跨機器通訊,請使用以網路為基礎的替代方案。 最好是使用額外負荷較低的純文字通訊協定,例如 HTTP。 Kestrel Web 伺服器 (部分機器翻譯) 是 ASP.NET Core 所使用的 Web 伺服器,也是此情況下可考慮使用的選項。 針對以網路基礎的跨機器案例,也可以考慮使用 System.Net.Sockets (部分機器翻譯)。 稍早所述的 StreamJsonRpc 可用來透過 Web 通訊端進行 JSON 或二進位 (透過 MessagePack) 通訊。

如需更多傳訊選項,請參閱 .NET 開放原始碼開發人員專案:傳訊 (英文)。

由於不支援遠端處理,因此在委派物件上呼叫 BeginInvoke()EndInvoke() 將擲回 PlatformNotSupportedException。 如需詳細資訊,請參閱針對 .NET Core 移轉 Delegate BeginInvoke 呼叫

程式碼存取安全性 (CAS)

依賴執行階段或架構來限制受控應用程式或程式庫可使用或執行之資源的沙箱功能,在 .NET Framework 上並不受支援,因此 .NET 6+ 也不予支援。 CAS 已不再被視為安全性界限,因為 .NET Framework 與執行階段中發生太多提高權限的案例。 此外,CAS 讓實作更為複雜,而且經常會對不需要加以使用的應用程式產生正確性與效能的影響。

使用作業系統提供的安全性界限 (例如,虛擬化、容器或使用者帳戶),以最低權限組合執行處理序。

安全性透明度

與 CAS 類似,安全性透明度會以宣告方式區隔沙箱化程式碼與安全性關鍵程式碼,但已不再支援作為安全性界限 (英文)。 Silverlight 會大量使用這項功能。

若要以最低權限組合執行處理序,使用作業系統所提供的安全性界限 (例如,虛擬化、容器或使用者帳戶)。

System.EnterpriseServices

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

Workflow Foundation

.NET 6+ 不支援 Windows Workflow Foundation (WF)。 如需替代方案,請參閱 CoreWF (英文)。

提示

Windows Communication Foundation (WCF) 伺服器可以透過使用 CoreWCF NuGet 套件 (英文),在 .NET 6+ 中使用。 如需詳細資訊,請參閱 CoreWCF 1.0 已發行 (英文)。

不支援某些反映發出 API

.NET 8 和舊版 .NET (Core) 不支援儲存 System.Reflection.Emit API 所產生的組件,而且無法使用 AssemblyBuilder.Save 方法。 此外,未提供 AssemblyBuilderAccess (部分機器翻譯) 列舉的下列欄位:

在 .NET 9 中,已實作 PersistedAssemblyBuilder,且 AssemblyBuilder.Save 方法已新增回反映發出程式庫。 若要深入了解如何使用此 API,請參閱 System.Reflection.Emit.AssemblyBuilder 類別

如需詳細資訊,請參閱 dotnet/執行階段問題 15704 (英文)。

載入多模組組件

.NET 6+ 中不支援由多個模組 (MSBuild 中的 OutputType=Module) 所組成的組件。

或者,考慮將個別模組合併成單一組件檔。

XSLT 指令碼區塊

只有 .NET Framework 中才支援 XSLT 指令碼區塊 (部分機器翻譯)。 .NET 6 或更新版本上不支援它們。

另請參閱