Compilación Native AOT
Active Native AOT en un proyecto de .NET, comprenda el análisis de trimming y publique un binario nativo autocontenido.
Compilación Native AOT es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
¿Qué es Native AOT?
La compilación nativa anticipada (AOT) compila su aplicación .NET en un binario nativo autocontenido durante la publicación. No hay compilador JIT ni se necesita el runtime de .NET en el destino: solo un ejecutable único.
Cuándo usar Native AOT
Native AOT es especialmente útil para microservicios, herramientas de CLI y funciones sin servidor, donde el tiempo de inicio y la huella de memoria son importantes. No es ideal para aplicaciones que dependen en gran medida de la reflexión durante la ejecución.
// 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)Publicación con Native AOT
Active AOT en el archivo del proyecto y publique con dotnet publish. El resultado es un único ejecutable nativo sin dependencia del runtime.
// .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 requiredMinimal API con Native AOT
Las Minimal APIs de ASP.NET Core son totalmente compatibles con Native AOT a partir de .NET 8. Use la plantilla dotnet new webapiaot para comenzar con una configuración previa.
// 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 { }Serialización JSON generada mediante código fuente
Native AOT no puede usar la serialización JSON basada en reflexión. Debe utilizar la generación de código fuente de System.Text.Json para producir el código de serialización durante la compilación.
// 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);Advertencias de trimming
Publicar con Native AOT habilita el trimming de forma predeterminada. El compilador muestra una advertencia cuando detecta código que podría fallar después de eliminar el código no utilizado. Trate las advertencias de trimming como errores durante la integración continua.
// .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) { }Analizador de compatibilidad con AOT
Ejecute el analizador de compatibilidad con AOT durante el desarrollo para detectar rutas de código incompatibles antes de que provoquen errores durante la publicación.
// 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 RequiresDynamicCodeComparación del rendimiento de inicio
Native AOT reduce drásticamente el tiempo de inicio y el uso de memoria en comparación con las aplicaciones compiladas con JIT. La contrapartida es un tiempo de publicación más prolongado y un ejecutable más grande en algunas cargas de trabajo.
// 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: función de Lambda con AOT
Una función de Lambda con Native AOT que utiliza el paquete oficial Amazon.Lambda.RuntimeSupport para obtener el máximo rendimiento durante el inicio en frío.
// 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\"}" };
}Comprobación rápida
¿Por qué debe utilizar la generación de código fuente de System.Text.Json en lugar de la serialización basada en reflexión con Native AOT?
Recapitulación: compilación con Native AOT
Conclusiones clave:
- Native AOT compila en un binario nativo autocontenido: no necesita un runtime
- Es ideal para aplicaciones sin servidor, microservicios y herramientas CLI (inicio rápido y bajo consumo de memoria)
- Habilítelo con
<PublishAot>true</PublishAot>y publique con-r <rid> - Debe utilizar la generación de código fuente de System.Text.Json: la serialización mediante reflexión no funcionará
- Utilice
EnableAotAnalyzerpara detectar problemas de compatibilidad durante el desarrollo - Contrapartida: mayor tiempo de publicación y limitaciones de la reflexión, pero un inicio en frío entre 5 y 35 veces más rápido
Preguntas frecuentes
¿La lección «Compilación Native AOT» es gratis?
Sí — el texto completo de «Compilación Native AOT» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Compilación Native AOT»?
Active Native AOT en un proyecto de .NET, comprenda el análisis de trimming y publique un binario nativo autocontenido. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Compilación Native AOT»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Compilación Native AOT
- Trimming y limitaciones de la reflexión
- ReadyToRun y compilación por niveles
- Benchmarking con BenchmarkDotNet