Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Publicar seu aplicativo como AOT Nativo produz um aplicativo autossuficiente e que foi compilado previamente (AOT) para código nativo. Os aplicativos AOT nativos têm tempo de inicialização mais rápido e volumes de memória menores. Esses aplicativos podem ser executados em computadores que não têm o runtime do .NET instalado.
O benefício do AOT nativo é mais significativo para cargas de trabalho com um alto número de instâncias implantadas, como infraestrutura de nuvem e serviços de hiperescalização. O .NET 8 adiciona suporte ASP.NET Core para AOT nativo.
O modelo de implantação nativo de AOT usa um compilador antecipado para compilar IL para código nativo durante a publicação. Os aplicativos AOT nativos não usam um compilador JIT (just-in-time) quando o aplicativo é executado. Aplicativos AOT nativos podem ser executados em ambientes restritos em que um JIT não é permitido. Os aplicativos AOT nativos têm como destino um ambiente de runtime específico, como Linux x64 ou Windows x64, assim como publicar um aplicativo independente.
Pré-requisitos
Visual Studio 2022 ou posterior, incluindo a carga de trabalho Desenvolvimento de Área de Trabalho com C++ com todos os componentes padrão.
Publicar AOT Nativo usando a CLI
Adicione
<PublishAot>true</PublishAot>ao arquivo de projeto.Essa propriedade habilita a compilação AOT nativa durante a publicação. Ele também habilita 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, pois controla comportamentos fora da publicação.
<PropertyGroup> <PublishAot>true</PublishAot> </PropertyGroup>Publique o aplicativo para um identificador de runtime específico usando
dotnet publish -r <RID>.O exemplo a seguir publica o aplicativo para Windows como um aplicativo AOT nativo em um computador com os pré-requisitos necessários instalados.
dotnet publish -r win-x64 -c ReleaseO exemplo a seguir publica o aplicativo para Linux como um aplicativo AOT nativo. Um binário AOT nativo produzido no computador Linux só funcionará na mesma versão ou mais recente do Linux. Por exemplo, o binário AOT nativo produzido no Ubuntu 20.04 será executado no Ubuntu 20.04 e posterior, mas não será executado 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 despojada do runtime do coreclr.
Confira os exemplos de AOT nativos disponíveis no repositório dotnet/samples no GitHub. Os exemplos incluem Linux e Dockerfiles do Windows 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 a AOT nativa. Considere quando uma biblioteca define a IsAotCompatible propriedade como true, por exemplo:
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
A configuração anterior atribui um valor padrão de true às seguintes propriedades:
IsTrimmableEnableTrimAnalyzerEnableSingleFileAnalyzerEnableAotAnalyzer
Esses analisadores ajudam a garantir que uma biblioteca seja compatível com o AOT nativo.
Verificar se os assemblies referenciados são compatíveis com AOT
Ao habilitar a análise AOT para uma biblioteca, você pode optar por habilitar a verificação de que todos os assemblies referenciados também são anotados para compatibilidade de AOT, configurando a propriedade VerifyReferenceAotCompatibility como true.
<PropertyGroup>
<IsAotCompatible>true</IsAotCompatible>
<VerifyReferenceAotCompatibility>true</VerifyReferenceAotCompatibility>
</PropertyGroup>
Quando essa propriedade está habilitada, o analisador avisa sobre qualquer assembly referenciado que não tenha o metadado IsAotCompatible. Isso ajuda a garantir que todas as dependências em seu projeto sejam anotadas para compatibilidade com Nativo AOT. O aviso emitido é IL3058.
Essa verificação é aceita porque:
- Nem todas as bibliotecas compatíveis com AOT foram atualizadas para incluir os
IsAotCompatiblemetadados. - O aviso poderá ser barulhento se você tiver muitas dependências que funcionam corretamente com AOT Nativa, sem estarem explicitamente marcadas como tal.
Observação
Os IsAotCompatible metadados do assembly foram introduzidos no .NET 10. As bibliotecas que foram publicadas visando versões anteriores do .NET não terão esse atributo, mesmo que tenham sido criadas com <IsAotCompatible>true</IsAotCompatible>.
Considere habilitar essa verificação quando quiser garantir que todas as suas dependências sejam explicitamente marcadas como compatíveis com AOT por seus autores.
Informações de depuração nativas
Por padrão, a publicação nativa de AOT gera informações de depuração em um arquivo separado.
- Linux: .dbg
- Windows: .pdb
- macOS: pasta .dSYM
O arquivo de depuração é necessário para executar o aplicativo no depurador ou inspecionar despejos de memória. Em plataformas semelhantes ao Unix, defina a StripSymbols propriedade como false para 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 do AOT nativo
Os aplicativos AOT nativos têm as seguintes limitações:
- Sem carregamento dinâmico, por exemplo,
Assembly.LoadFile. - Nenhuma geração de código em tempo de execução, por exemplo,
System.Reflection.Emit. - Não há C++/CLI.
- Windows: Sem COM interno.
- Exige corte, que tem algumas limitações.
- Implica a compilação em um único arquivo, que tem incompatibilidades conhecidas.
- Os aplicativos incluem bibliotecas de runtime necessárias (assim como aplicativos autocontidos, aumentando seu tamanho em comparação com aplicativos dependentes de estrutura).
- System.Linq.Expressions sempre use o formulário interpretado, que é mais lento do que o código compilado gerado pelo runtime.
- Parâmetros genéricos substituídos por argumentos de tipo struct têm código especializado gerado para cada instanciação. No runtime dinâmico, muitas instanciações são geradas sob demanda. No AOT nativo, 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érica também terão uma instanciação para cada tipo de implementação ou substituição.
- Nem todas as bibliotecas de runtime são totalmente anotadas como compatíveis com AOT nativo. Ou seja, alguns avisos nas bibliotecas de runtime não são acionáveis pelos desenvolvedores finais.
- Suporte de diagnóstico para depuração e criação de perfil com algumas limitações.
- Suporte para alguns recursos do ASP.NET Core. Para obter mais informações, consulte Suporte do ASP.NET Core para Native AOT.
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 runtime.
Restrições de plataforma/arquitetura
A tabela a seguir mostra os destinos de compilação com suporte.
| Plataforma | Arquitetura com suporte | Anotações |
|---|---|---|
| Windows | x64, Arm64 | |
| Linux | x64, Arm64 | |
| macOS | x64, Arm64 | |
| Ios | Arm64 | Suporte experimental |
| iOSSimulator | x64, Arm64 | Suporte experimental |
| tvOS | Arm64 | Suporte experimental |
| tvOSSimulator | x64, Arm64 | Suporte experimental |
| MacCatalyst | x64, Arm64 | Suporte experimental |
| Android | x64, Arm64 | Experimental, sem interoperabilidade embutida para Java |
Para obter mais informações sobre como a plataforma específica tem suporte com o AOT Nativo, siga o link da tabela.