Partilhar via


Implantação de AOT nativa

Publicar a sua aplicação como AOT nativo produz uma aplicação que é autossuficiente e que foi compilada antecipadamente para código nativo. Os aplicativos AOT nativos têm tempo de inicialização mais rápido e menores pegadas de memória. Esses aplicativos podem ser executados em máquinas que não têm o tempo de execução do .NET instalado.

O benefício da AOT nativa é mais significativo para cargas de trabalho com um alto número de instâncias implantadas, como infraestrutura de nuvem e serviços de hiperescala. O .NET 8 adiciona suporte ASP.NET Core para AOT nativo.

O modelo de implantação AOT nativo usa um compilador antecipado para compilar IL para código nativo no momento da publicação. Os aplicativos AOT nativos não usam um compilador just-in-time (JIT) quando o aplicativo é executado. Os aplicativos AOT nativos podem ser executados em ambientes restritos onde um JIT não é permitido. Os aplicativos AOT nativos visam um ambiente de tempo de execução específico, como Linux x64 ou Windows x64, assim como publicar um aplicativo independente.

Pré-requisitos

Visual Studio 2022, incluindo o workload Desenvolvimento Desktop com C++ com todos os componentes padrão.

Publicar AOT nativa usando a CLI

  1. Adicione <PublishAot>true</PublishAot> ao seu arquivo de projeto.

    Esta propriedade permite a compilação AOT nativa durante a publicação. Ele também permite a análise dinâmica de uso de código durante a compilação e edição. É preferível colocar essa configuração no arquivo de projeto em vez de passá-la na linha de comando, já que ela controla comportamentos fora da publicação.

    <PropertyGroup>
        <PublishAot>true</PublishAot>
    </PropertyGroup>
    
  2. Publique a aplicação para um identificador de tempo de execução específico usando dotnet publish -r <RID>.

    O exemplo a seguir publica o aplicativo para Windows como um aplicativo AOT nativo em uma máquina com os pré-requisitos necessários instalados.

    dotnet publish -r win-x64 -c Release

    O exemplo a seguir publica o aplicativo para Linux como um aplicativo AOT nativo. Um binário AOT nativo produzido na máquina Linux só vai funcionar na mesma versão Linux ou mais recente. Por exemplo, binário AOT nativo produzido no Ubuntu 20.04 vai rodar no Ubuntu 20.04 e posterior, mas não vai rodar no Ubuntu 18.04.

    dotnet publish -r linux-arm64 -c Release

O aplicativo está disponível no diretório de publicação e contém todo o código necessário para ser executado nele, incluindo uma versão reduzida do tempo de execução do coreclr.

Confira os exemplos de AOT nativos disponíveis no repositório dotnet/samples no GitHub. Os exemplos incluem Linux e Windows Dockerfiles que demonstram como automatizar a instalação de pré-requisitos e publicar projetos .NET com AOT nativo usando contêineres.

Analisadores de compatibilidade AOT

A IsAotCompatible propriedade é usada para indicar se uma biblioteca é compatível com AOT nativo. Considere quando uma biblioteca define a propriedade IsAotCompatible para true, por exemplo:

<PropertyGroup>
    <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

A configuração anterior atribui um padrão de true às seguintes propriedades:

  • IsTrimmable
  • EnableTrimAnalyzer
  • EnableSingleFileAnalyzer
  • EnableAotAnalyzer

Esses analisadores ajudam a garantir que uma biblioteca seja compatível com a AOT nativa.

Informações de depuração nativas

Por padrão, a publicação AOT nativa produz informações de depuração em um arquivo separado:

  • Linux: .dbg
  • Windows: .pdb
  • macOS: pasta .dSYM

O ficheiro de depuração é necessário para executar a aplicação sob o depurador ou inspecionar registos de falhas. Em plataformas semelhantes ao Unix, defina a propriedade StripSymbols para false a fim de incluir as informações de depuração no binário nativo. A inclusão de informações de depuração torna o binário nativo maior.

<PropertyGroup>
    <StripSymbols>false</StripSymbols>
</PropertyGroup>

Limitações da implantação de AOT nativo

Os aplicativos AOT nativos têm as seguintes limitações:

  • Sem carregamento dinâmico, por exemplo, Assembly.LoadFile.
  • Sem geração de código em tempo de execução, por exemplo, System.Reflection.Emit.
  • Sem C++/CLI.
  • Windows: Sem COM incorporado.
  • Requer corte de cabelo, o qual tem limitações.
  • Implica a compilação num único ficheiro, que tem incompatibilidades conhecidas.
  • As aplicações incluem bibliotecas de runtime necessárias (tal como as aplicações autónomas, aumentando o seu tamanho em comparação com as aplicações dependentes do framework).
  • System.Linq.Expressions sempre use sua forma interpretada, que é mais lenta do que o código compilado gerado em tempo de execução.
  • Os parâmetros genéricos substituídos por argumentos de tipo struct terão código especializado gerado para cada instanciação. No tempo de execução dinâmico, muitas instanciações são geradas sob demanda. Na AOT nativa, todas as instanciações são pré-geradas. Isso pode ter um impacto significativo no tamanho do disco do aplicativo. Métodos virtuais genéricos e métodos de instância genéricos também terão uma instanciação para cada tipo de implementação ou substituição.
  • Nem todas as bibliotecas de tempo de execução são totalmente anotadas para serem compatíveis com AOT nativo. Ou seja, alguns avisos nas bibliotecas de tempo de execução não são acionáveis pelos desenvolvedores finais.
  • Suporte de diagnóstico para depuração e criação de perfis com algumas limitações.
  • Suporte para alguns recursos ASP.NET Core. Para obter mais informações, consulte Suporte ASP.NET Core para AOT nativo.

O processo de publicação analisa todo o projeto e suas dependências para possíveis limitações. Avisos são emitidos para cada limitação que o aplicativo publicado pode encontrar em tempo de execução.

Restrições de plataforma/arquitetura

A tabela a seguir mostra os destinos de compilação suportados.

Plataforma Arquitetura suportada Observações
Mac OS x64, ARM64
Aplicações Linux x64, ARM64
macOS x64, ARM64
iOS Braço64 Apoio experimental
iOSSimulator x64, ARM64 Apoio experimental
tvOS Braço64 Apoio experimental
tvOSSimulator x64, ARM64 Apoio experimental
MacCatalisador x64, ARM64 Apoio experimental
Androide x64, ARM64 Funcionalidade experimental, sem interoperabilidade Java integrada

Para obter mais informações sobre como uma plataforma específica é suportada com AOT nativo, siga o link da tabela.