Compilazione Native AOT
Abiliti Native AOT in un progetto .NET, comprenda l'analisi del trimming e pubblichi un binario nativo autonomo.
Compilazione Native AOT è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Che cos'è Native AOT?
La compilazione Native Ahead-of-Time (AOT) compila l'applicazione .NET in un binario nativo autonomo al momento della pubblicazione. Non sono necessari né un compilatore JIT né il runtime .NET nel sistema di destinazione: basta un singolo eseguibile.
Quando utilizzare Native AOT
Native AOT è particolarmente indicato per microservizi, strumenti CLI e funzioni serverless, dove contano il tempo di avvio e l'ingombro in memoria. Non è ideale per le applicazioni che dipendono fortemente dalla reflection a runtime.
// 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)Pubblicazione con Native AOT
Abiliti AOT nel file di progetto e pubblichi con dotnet publish. Il risultato è un singolo eseguibile nativo senza dipendenze dal 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
Le Minimal API di ASP.NET Core supportano completamente Native AOT a partire da .NET 8+. Utilizzi il modello dotnet new webapiaot come punto di partenza preconfigurato.
// 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 { }Serializzazione JSON generata dal codice sorgente
Native AOT non può usare la serializzazione JSON basata sulla reflection. È necessario usare la generazione del codice sorgente di System.Text.Json per produrre il codice di serializzazione in fase di compilazione.
// 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);Avvisi del trimming
La pubblicazione con Native AOT abilita il trimming per impostazione predefinita. Il compilatore avvisa quando rileva codice che potrebbe non funzionare dopo la rimozione del codice inutilizzato. Tratti gli avvisi del trimming come errori durante la CI.
// .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) { }Analizzatore di compatibilità AOT
Esegua l'analizzatore di compatibilità AOT durante lo sviluppo per rilevare i percorsi di codice incompatibili prima che diventino errori in fase di pubblicazione.
// 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 RequiresDynamicCodeConfronto delle prestazioni di avvio
Native AOT riduce drasticamente il tempo di avvio e l'uso della memoria rispetto alle app compilate con JIT. Il compromesso consiste in tempi di pubblicazione più lunghi e, per alcuni carichi di lavoro, in file eseguibili più grandi.
// 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 reale: funzione Lambda con AOT
Una funzione Lambda Native AOT che usa il pacchetto ufficiale Amazon.Lambda.RuntimeSupport per ottenere le massime prestazioni durante l'avvio a freddo.
// 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 rapida
Perché con Native AOT è necessario usare la generazione del codice sorgente di System.Text.Json invece della serializzazione basata sulla reflection?
Riepilogo: compilazione Native AOT
Punti chiave:
- Native AOT compila in un binario nativo autonomo — non è necessario alcun runtime
- È ideale per il serverless, i microservizi e gli strumenti CLI (avvio rapido, basso consumo di memoria)
- Lo abiliti con
<PublishAot>true</PublishAot>e pubblichi con-r <rid> - È necessario usare la generazione del codice sorgente di System.Text.Json — la serializzazione tramite reflection non funzionerà
- Usi
EnableAotAnalyzerper rilevare i problemi di compatibilità durante lo sviluppo - Compromesso: tempi di pubblicazione più lunghi e limitazioni della reflection, ma avvio a freddo da 5 a 35 volte più rapido
Domande Frequenti
La lezione «Compilazione Native AOT» è gratuita?
Sì — il testo completo di «Compilazione Native AOT» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Compilazione Native AOT»?
Abiliti Native AOT in un progetto .NET, comprenda l'analisi del trimming e pubblichi un binario nativo autonomo. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Compilazione Native AOT»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Compilazione Native AOT
- Trimming e limitazioni della reflection
- ReadyToRun e compilazione a livelli
- Benchmark con BenchmarkDotNet