行動端程式碼產生方式從 Mono 變為 CoreCLR

.NET 11 行動應用程式可以使用 CoreCLR JIT、ReadyToRun(R2R)及 CoreCLR 直譯器。 可用的模式仍依目標與建置組態而異。

所推出的版本

.NET 11

以前的行為

.NET 10 行動應用程式可以使用 Mono JIT、Mono AOT、Mono AOT 搭配 LLVM 以及 Mono 直譯器。 可用的模式依據目標與建置組態而定。

有些應用程式只使用 Mono 直譯器處理選定的組件清單。 這幫助那些應用程式在相容性和速度之間取得平衡。

新行為

.NET 11 行動應用程式可以使用 CoreCLR JIT、ReadyToRun(R2R)及 CoreCLR 直譯器。 可用的模式仍依目標與建置組態而異。

R2R 是 AOT 的技術,但它並不是 Mono AOT 的新名稱。 它會將 IL 和元資料保存在應用程式中,並在目標允許時使用 JIT 或直譯器。

Android Release 組建使用 CoreCLR R2R 預先編譯部分應用程式,其餘部分則使用 JIT。 MauiEnableFullReadyToRun=true 將 R2R 套用至整個應用程式。 應用程式仍可在執行時使用 JIT 以支援動態行為。 除錯編譯版使用較少 R2R,所以大部分應用程式都用 JIT 執行。

Apple Release 版本會用 R2R 預編譯整個應用程式,並且可以在執行時使用直譯器來實現動態行為。 除錯編譯版使用較少的 R2R,所以大部分應用程式會用直譯器執行。

NativeAOT 是行動平台上另一個程式碼產生選項。 它與 Mono AOT 及 CoreCLR R2R 不同。 Android NativeAOT 目前在 .NET 11 中處於實驗階段。

破壞性變更的類型

此變更會影響 來源相容 性與 行為。

變更原因

CoreCLR 採用自己的編譯器與執行模型。 Mono AOT 設定無法控制 CoreCLR R2R。

  • 使用行動版工作負載的 R2R 預設值。
  • 不要試著把每個 Mono AOT 設定轉換成 R2R 設定。
  • 只有在你評估 App 後才使用 MauiEnableFullReadyToRun 。
  • 測量啟動時間、速度、記憶體使用量和應用程式大小。
  • 如果你正在考慮 NativeAOT,請參考 .NET MAUI Native AOT 部署指引,因為它是獨立的部署模式,有不同的限制。 在 .NET 11 中,請將 Android NativeAOT 視為實驗性版本。

受影響的 API

沒有移除任何受管理的 API。 以下 MSBuild 屬性與項目在應用程式使用 CoreCLR 時不再提供 Mono 程式碼產生效果:

  • Android:RunAOTCompilation,AotAssemblies,EnableLLVM,AndroidEnableProfiledAot,AndroidAotMode,AndroidAotAdditionalArguments,AndroidExtraAotOptions,UseInterpreter,@(AndroidAotProfile),AndroidAotEnableLazyLoad,AndroidUseInterpreter,和AndroidEnableMarshalMethods。
  • iOS、tvOS 與 Mac Catalyst:UseInterpreter, MtouchInterpreter, MtouchUseLlvm, MtouchFloat32, MonoUseCompressedInterfaceBitmap, RunAotCompilation, AotAssemblies,與 AotCompileMaxDegreeOfParallelism。

這些設定可設定 Mono AOT 編譯、LLVM、直譯器選擇、AOT 輸入或產生的 marshal 方法。 他們不設定 CoreCLR ReadyToRun 管線。 關於詳細的遷移與建置診斷行為,請參閱 Mono 專案屬性不再用於設定行動應用程式。