0Pricing
C# Academy · Lektion

Native-AOT-Kompilierung

Aktivieren Sie Native AOT in einem .NET-Projekt, verstehen Sie die Trimming-Analyse und veröffentlichen Sie eine eigenständige native Binärdatei.

Native-AOT-Kompilierung ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist Native AOT?

Native-Ahead-of-Time-Kompilierung (AOT) kompiliert Ihre .NET-Anwendung zum Zeitpunkt der Veröffentlichung in eine eigenständige native Binärdatei. Es gibt keinen JIT-Compiler, und auf dem Zielsystem ist keine .NET-Laufzeit erforderlich – nur eine einzelne ausführbare Datei.

Wann Sie Native AOT verwenden sollten

Native AOT eignet sich besonders für Microservices, CLI-Tools und serverlose Funktionen, bei denen Startzeit und Speicherbedarf eine wichtige Rolle spielen. Für Anwendungen, die stark auf Laufzeitreflexion setzen, ist es weniger geeignet.

// 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)

Mit Native AOT veröffentlichen

Aktivieren Sie AOT in der Projektdatei und veröffentlichen Sie die Anwendung mit dotnet publish. Die Ausgabe ist eine einzelne native ausführbare Datei ohne Abhängigkeit von einer Laufzeitumgebung.

// .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 required

Minimal API mit Native AOT

ASP.NET Core Minimal APIs unterstützen Native AOT ab .NET 8+ vollständig. Verwenden Sie die Vorlage dotnet new webapiaot als vorkonfigurierten Ausgangspunkt.

// 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 { }

Quellcodegenerierte JSON-Serialisierung

Native AOT kann keine JSON-Serialisierung auf Basis von Reflection verwenden. Sie müssen die Quellcodegenerierung von System.Text.Json verwenden, um den Serialisierungscode zur Kompilierzeit zu erzeugen.

// 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);

Trimming-Warnungen

Beim Veröffentlichen mit Native AOT ist Trimming standardmäßig aktiviert. Der Compiler gibt eine Warnung aus, wenn er Code erkennt, der nach dem Entfernen nicht verwendeten Codes möglicherweise fehlschlägt. Behandeln Sie Trimming-Warnungen in CI als Fehler.

// .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) { }

AOT-Kompatibilitätsanalyse

Führen Sie die AOT-Kompatibilitätsanalyse während der Entwicklung aus, um inkompatible Codepfade zu erkennen, bevor sie beim Veröffentlichen zu Fehlern führen.

// 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 RequiresDynamicCode

Vergleich der Startleistung

Native AOT reduziert die Startzeit und den Speicherverbrauch im Vergleich zu JIT-kompilierten Anwendungen deutlich. Der Nachteil sind eine längere Veröffentlichungsdauer und bei manchen Workloads eine größere ausführbare Datei.

// 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 savings

Praxisbeispiel: Lambda-Funktion mit AOT

Eine Native-AOT-Lambda-Funktion, die das offizielle Paket Amazon.Lambda.RuntimeSupport für eine möglichst hohe Leistung beim Kaltstart verwendet.

// 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\"}" };
}

Kurzer Check

Warum müssen Sie mit Native AOT die Quellcodegenerierung von System.Text.Json anstelle einer auf Reflection basierenden Serialisierung verwenden?

Zusammenfassung: Native-AOT-Kompilierung

Wichtigste Erkenntnisse:

  • Native AOT kompiliert zu einer eigenständigen nativen Binärdatei – es ist keine Laufzeit erforderlich
  • Ideal für serverlose Anwendungen, Microservices und CLI-Tools (schneller Start, geringer Speicherverbrauch)
  • Aktivieren Sie Native AOT mit <PublishAot>true</PublishAot> und veröffentlichen Sie mit -r <rid>
  • Sie müssen die Quellcodegenerierung von System.Text.Json verwenden – die Reflection-Serialisierung funktioniert nicht
  • Verwenden Sie EnableAotAnalyzer, um Kompatibilitätsprobleme während der Entwicklung zu erkennen
  • Kompromiss: längere Veröffentlichungsdauer und Einschränkungen bei Reflection, dafür 5- bis 35-mal schnellerer Kaltstart

Häufig gestellte Fragen

Ist die Lektion „Native-AOT-Kompilierung“ kostenlos?

Ja — der vollständige Text von „Native-AOT-Kompilierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Native-AOT-Kompilierung“?

Aktivieren Sie Native AOT in einem .NET-Projekt, verstehen Sie die Trimming-Analyse und veröffentlichen Sie eine eigenständige native Binärdatei. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Native-AOT-Kompilierung“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Native-AOT-Kompilierung
  2. Trimming und Einschränkungen durch Reflection
  3. ReadyToRun und tiered Compilation
  4. Benchmarking mit BenchmarkDotNet
← Zurück zu C# Academy