A geração de código em dispositivos móveis muda de Mono para CoreCLR

Aplicativos móveis do .NET 11 podem usar o CoreCLR JIT, ReadyToRun (R2R) e o interpretador CoreCLR. Os modos disponíveis ainda dependem do destino e da configuração de build.

Versão introduzida

.NET 11

Comportamento anterior

.NET 10 aplicativos móveis poderiam usar o Mono JIT, Mono AOT, Mono AOT com LLVM e o interpretador Mono. Os modos disponíveis dependiam do destino e da configuração de build.

Alguns aplicativos usaram o interpretador Mono para apenas uma lista selecionada de assemblies. Isso ajudou esses aplicativos a equilibrar a compatibilidade e a velocidade.

Novo comportamento

.NET 11 aplicativos móveis podem usar o CoreCLR JIT, ReadyToRun (R2R) e o interpretador CoreCLR. Os modos disponíveis ainda dependem do destino e da configuração de build.

R2R é uma tecnologia AOT, mas não é um nome novo para Mono AOT. Isso mantém IL e metadados no aplicativo e pode usar o JIT ou o interpretador quando o destino permitir.

Os builds de Release do Android usam o CoreCLR R2R para pré-compilar parte do aplicativo e usar o JIT para o restante. MauiEnableFullReadyToRun=true aplica R2R a todo o aplicativo. O aplicativo ainda pode usar o JIT em tempo de execução para comportamento dinâmico. Os builds de depuração usam menos R2R, portanto, a maior parte do aplicativo é executada com o JIT.

As compilações de Release da Apple pré-compilam todo o aplicativo com R2R e podem usar o interpretador em tempo de execução para comportamento dinâmico. Os builds de depuração usam menos R2R, portanto, a maior parte do aplicativo é executada com o interpretador.

NativeAOT é outra opção de geração de código em plataformas móveis. É diferente de ambos, Mono AOT e CoreCLR R2R. O Android NativeAOT é experimental no .NET 11.

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade de código-fonte e o comportamento.

Motivo da alteração

O CoreCLR usa seu próprio compilador e modelo de execução. As configurações do Mono AOT não controlam o CoreCLR R2R.

  • Use os padrões R2R da carga de trabalho móvel.
  • Não tente converter cada configuração do Mono AOT em uma configuração R2R.
  • Só use MauiEnableFullReadyToRun depois de medir o aplicativo.
  • Medir o tempo de inicialização, a velocidade, o uso da memória e o tamanho do aplicativo.
  • Se você estiver considerando NativeAOT, examine as diretrizes de implantação do AOT nativo de .NET MAUI porque ele é um modelo de implantação separado com restrições diferentes. Trate o Android NativeAOT como experimental no .NET 11.

APIs afetadas

Nenhuma API gerenciada é removida. As seguintes propriedades e itens do MSBuild não fornecem mais o efeito de geração de código Mono quando o aplicativo usa o CoreCLR:

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

Essas configurações configuram a compilação mono AOT, LLVM, seleção de interpretador, entradas AOT ou métodos marshal gerados. Eles não configuram o pipeline ReadyToRun do CoreCLR. Para obter detalhes sobre a migração e o comportamento de build-diagnostic, consulte As propriedades do projeto Mono não configuram mais aplicativos móveis.