Создание кода на мобильных устройствах меняется с Mono на CoreCLR

Мобильные приложения .NET 11 могут использовать JIT CoreCLR, ReadyToRun (R2R) и интерпретатор CoreCLR. Доступные режимы по-прежнему зависят от целевой платформы и конфигурации сборки.

Представленная версия

.NET 11

Предыдущее поведение

мобильные приложения .NET 10 могут использовать Mono JIT, Mono AOT, Mono AOT с LLVM и интерпретатор Mono. Доступные режимы зависели от цели и конфигурации сборки.

Некоторые приложения использовали интерпретатор Mono только для выбранного списка сборок. Это помогло этим приложениям сбалансировать совместимость и скорость.

Новое поведение

В мобильных приложениях .NET 11 можно использовать JIT CoreCLR, ReadyToRun (R2R) и интерпретатор CoreCLR. Доступные режимы по-прежнему зависят от цели и конфигурации сборки.

R2R — это технология AOT, но это не новое имя для Mono AOT. Он сохраняет IL и метаданные в приложении и может использовать JIT или интерпретатор, если это поддерживается целевой платформой.

Сборки выпуска Android используют 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.
  • Используйте MauiEnableFullReadyToRun только после оценки приложения.
  • Измеряйте время запуска, скорость, использование памяти и размер приложения.
  • Если вы рассматриваете NativeAOT, ознакомьтесь с руководством по развертыванию .NET MAUI Native AOT, так как это отдельная модель развертывания с различными ограничениями. Рассматривать Android NativeAOT как экспериментальный в .NET 11.

Затронутые API

Управляемые API не удаляются. Следующие свойства и элементы MSBuild больше не обеспечивают эффект генерации кода Mono, если приложение использует CoreCLR:

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

Эти параметры настраивают компиляцию Mono AOT, LLVM, выбор интерпретатора, входные файлы для AOT-компиляции или сгенерированные методы маршалинга. Они не настраивают конвейер CoreCLR ReadyToRun. Подробные сведения о поведении миграции и диагностики сборки см. в свойствах проекта Mono, которые больше не используются для настройки мобильных приложений.