Compilação Native AOT
Ative Native AOT em um projeto .NET, entenda a análise de corte e publique um binário nativo autocontido.
Compilação Native AOT é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
O que é AOT nativo?
A compilação nativa antecipada (AOT) compila seu aplicativo .NET em um binário nativo independente no momento da publicação. Não há compilador JIT nem necessidade do ambiente de execução do .NET no destino — apenas um único executável.
Quando usar AOT nativo
O AOT nativo é ideal para microsserviços, ferramentas de CLI e funções sem servidor, nas quais o tempo de inicialização e o consumo de memória são importantes. Ele não é ideal para aplicativos que dependem muito de reflexão em tempo de execução.
// Ideal use cases:
// - Serverless functions (AWS Lambda, Azure Functions)
// - High-throughput microservices (fast cold start)
// - CLI tools shipped as single-file executables
// - IoT / embedded scenarios
// Poor fit:
// - Apps using extensive reflection (e.g., dynamic proxies)
// - Apps loading plugins at runtime
// - Apps depending on libraries that don't support trimming
// Key benefits:
// - Sub-10ms startup time (vs 200-500ms for JIT)
// - Lower memory at startup (no JIT overhead)
// - Smaller attack surface (no JIT engine)Publicação com AOT nativo
Ative o AOT no arquivo do projeto e publique com dotnet publish. A saída é um único executável nativo, sem dependência do ambiente de execução.
// .csproj:
<PropertyGroup>
<PublishAot>true</PublishAot>
<!-- Optional: disable invariant globalization for smaller binary -->
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
// Publish for Linux x64:
dotnet publish -r linux-x64 -c Release
// Publish for Windows x64:
dotnet publish -r win-x64 -c Release
// Output: bin/Release/net9.0/linux-x64/publish/MyApp
// Single executable, no dotnet runtime requiredAPI mínima com AOT nativo
As APIs mínimas do ASP.NET Core são totalmente compatíveis com AOT nativo a partir do .NET 8+. Use o modelo dotnet new webapiaot para começar com uma configuração pré-definida.
// dotnet new webapiaot -n FastApi
// Program.cs generated template:
var builder = WebApplication.CreateSlimBuilder(args); // AOT-optimized
// Must register serialization context for AOT:
builder.Services.ConfigureHttpJsonOptions(opts =>
opts.SerializerOptions.TypeInfoResolverChain.Insert(0,
AppJsonSerializerContext.Default));
var app = builder.Build();
app.MapGet("/hello", () => new Message("Hello, Native AOT!"));
app.Run();
record Message(string Text);
[JsonSerializable(typeof(Message))]
internal partial class AppJsonSerializerContext : JsonSerializerContext { }Serialização JSON gerada a partir do código-fonte
Native AOT não pode usar serialização JSON baseada em reflexão. Você deve usar a geração de código-fonte do System.Text.Json para produzir o código de serialização em tempo de compilação.
// Define types to serialize:
public record Product(int Id, string Name, decimal Price);
public record OrderDto(int OrderId, List<Product> Items);
// Create a JsonSerializerContext for AOT:
[JsonSerializable(typeof(Product))]
[JsonSerializable(typeof(OrderDto))]
[JsonSerializable(typeof(List<Product>))]
internal partial class MyJsonContext : JsonSerializerContext { }
// Serialize / deserialize without reflection:
var json = JsonSerializer.Serialize(product, MyJsonContext.Default.Product);
var product = JsonSerializer.Deserialize(json, MyJsonContext.Default.Product);Avisos de corte
Publicar com Native AOT habilita o corte por padrão. O compilador avisa quando detecta código que pode falhar depois que o código não utilizado for removido. Trate os avisos de corte como erros durante a integração contínua.
// .csproj: treat warnings as errors in CI
<PropertyGroup>
<PublishAot>true</PublishAot>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<TrimmerRootDescriptor>TrimmerRoots.xml</TrimmerRootDescriptor>
</PropertyGroup>
// Suppressing a specific warning when you know it is safe:
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MyClass))]
public static void EnsureMyClassSurvivesTrimming() { }
// Or annotate parameters:
public static void Register(
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
Type serviceType) { }Analisador de compatibilidade com AOT
Execute o analisador de compatibilidade com AOT durante o desenvolvimento para detectar caminhos de código incompatíveis antes que eles se tornem falhas no momento da publicação.
// Enable analysis without actually publishing AOT:
<PropertyGroup>
<EnableAotAnalyzer>true</EnableAotAnalyzer>
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
<EnableSingleFileAnalyzer>true</EnableSingleFileAnalyzer>
</PropertyGroup>
// Run:
// dotnet build
// => analyzer reports issues in build output
// Common warnings:
// IL2026: member uses RequiresUnreferencedCode
// IL2046: member annotated with RequiresUnreferencedCode derives from unannotated
// IL3050: member uses RequiresDynamicCodeComparação do desempenho de inicialização
Native AOT reduz drasticamente o tempo de inicialização e o uso de memória em comparação com aplicações compiladas com JIT. A desvantagem é um tempo de publicação maior e, em algumas cargas de trabalho, um executável maior.
// Typical Minimal API measurements:
// JIT (.NET 9, linux-x64):
// Startup time: ~180ms
// Memory (RSS): ~60 MB
// Publish time: ~5s
// Executable: self-contained ~80 MB
// Native AOT (.NET 9, linux-x64):
// Startup time: ~5ms (36x faster)
// Memory (RSS): ~20 MB (3x less)
// Publish time: ~30s (6x slower to build)
// Executable: ~10 MB (8x smaller)
// For AWS Lambda / Azure Container Apps:
// AOT cold start: <10ms vs JIT: 300-500ms = significant billing savingsCaso real: função do Lambda com AOT
Uma função do Lambda com Native AOT que usa o pacote oficial Amazon.Lambda.RuntimeSupport para obter o melhor desempenho possível em inicializações a frio.
// dotnet new lambda.NativeAOT
// .csproj:
// <PublishAot>true</PublishAot>
// <StripSymbols>true</StripSymbols>
public class Function
{
[JsonSerializable(typeof(APIGatewayProxyRequest))]
[JsonSerializable(typeof(APIGatewayProxyResponse))]
internal partial class LambdaContext : JsonSerializerContext { }
static async Task Main()
{
Func<APIGatewayProxyRequest, ILambdaContext, APIGatewayProxyResponse>
handler = FunctionHandler;
await LambdaBootstrapBuilder
.Create(handler, LambdaContext.Default.APIGatewayProxyRequest)
.Build()
.RunAsync();
}
static APIGatewayProxyResponse FunctionHandler(
APIGatewayProxyRequest req, ILambdaContext ctx)
=> new() { StatusCode = 200, Body = "{\"status\":\"ok\"}" };
}Verificação rápida
Por que você deve usar a geração de código-fonte do System.Text.Json em vez da serialização baseada em reflexão com Native AOT?
Recapitulação: compilação Native AOT
Principais conclusões:
- Native AOT compila para um binário nativo autocontido — nenhum ambiente de execução é necessário
- Ideal para aplicações sem servidor, microsserviços e ferramentas de CLI (inicialização rápida, baixo consumo de memória)
- Habilite com
<PublishAot>true</PublishAot>e publique com-r <rid> - É necessário usar a geração de código-fonte do System.Text.Json — a serialização por reflexão não funcionará
- Use
EnableAotAnalyzerpara detectar problemas de compatibilidade durante o desenvolvimento - Desvantagem: maior tempo de publicação e limitações de reflexão, mas inicialização a frio de 5 a 35 vezes mais rápida
Perguntas Frequentes
A aula “Compilação Native AOT” é grátis?
Sim — o texto completo de “Compilação Native AOT” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Compilação Native AOT”?
Ative Native AOT em um projeto .NET, entenda a análise de corte e publique um binário nativo autocontido. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Compilação Native AOT”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Compilação Native AOT
- Limitações de corte e reflexão
- ReadyToRun e compilação em camadas
- Benchmarking com BenchmarkDotNet