Native AOT Derlemesi
.NET projesinde Native AOT'yi etkinleştirin, kırpma analizini anlayın ve kendi içinde çalışan yerel bir ikili dosya yayımlayın.
Native AOT Derlemesi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Yerel AOT Nedir?
Yerel, önceden AOT derlemesi, .NET uygulamanızı yayımlama sırasında kendi kendine yeten yerel bir ikili dosyaya derler. JIT derleyicisi yoktur, hedefte .NET çalışma zamanı gerekmez; yalnızca tek bir yürütülebilir dosya bulunur.
Yerel AOT Ne Zaman Kullanılır?
Yerel AOT; başlangıç süresinin ve bellek ayak izinin önemli olduğu mikro hizmetlerde, CLI araçlarında ve sunucusuz işlevlerde öne çıkar. Çalışma zamanındaki yansımaya yoğun biçimde dayanan uygulamalar için ideal değildir.
// 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)Yerel AOT ile Yayımlama
Proje dosyasında AOT'yi etkinleştirin ve dotnet publish ile yayımlayın. Çıktı, çalışma zamanı bağımlılığı olmayan tek bir yerel yürütülebilir dosyadır.
// .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 requiredYerel AOT ile Minimal API
ASP.NET Core Minimal API'leri .NET 8 ve sonraki sürümlerde Yerel AOT'yi tamamen destekler. Önceden yapılandırılmış bir başlangıç noktası için dotnet new webapiaot şablonunu kullanın.
// 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 { }Kaynak Tarafından Oluşturulan JSON Serileştirmesi
Native AOT, yansıma tabanlı JSON serileştirmeyi kullanamaz. Derleme sırasında serileştirme kodu oluşturmak için System.Text.Json kaynak oluşturmayı kullanmanız gerekir.
// 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);Kırpma Uyarıları
Native AOT ile yayımlama, kırpmayı varsayılan olarak etkinleştirir. Derleyici, kullanılmayan kod kaldırıldıktan sonra başarısız olabilecek kodları algıladığında uyarı verir. CI sırasında kırpma uyarılarını hata olarak değerlendirin.
// .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 Uyumluluk Çözümleyicisi
Uyumsuz kod yollarını yayımlama zamanı hatalarına dönüşmeden önce yakalamak için geliştirme sırasında AOT uyumluluk çözümleyicisini çalıştırı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 RequiresDynamicCodeBaşlangıç Performansı Karşılaştırması
Native AOT, JIT ile derlenen uygulamalara kıyasla başlangıç süresini ve bellek kullanımını büyük ölçüde azaltır. Bunun karşılığında, bazı iş yüklerinde yayımlama süresi uzar ve yürütülebilir dosya boyutu büyür.
// 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 savingsGerçek Dünya: AOT ile Lambda İşlevi
Maksimum soğuk başlangıç performansı için resmî Amazon.Lambda.RuntimeSupport paketini kullanan bir Native AOT Lambda işlevi.
// 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\"}" };
}Hızlı Kontrol
Native AOT ile yansıma tabanlı serileştirme yerine neden System.Text.Json kaynak oluşturmayı kullanmanız gerekir?
Özet: Native AOT Derlemesi
Temel çıkarımlar:
- Native AOT, kendi içinde bulunan yerel bir ikili dosyaya derlenir — çalışma zamanına gerek yoktur
- Sunucusuz uygulamalar, mikro hizmetler ve CLI araçları için idealdir (hızlı başlangıç, düşük bellek kullanımı)
<PublishAot>true</PublishAot>ile etkinleştirin ve-r <rid>ile yayımlayın- System.Text.Json kaynak oluşturmayı kullanmanız gerekir — yansıma serileştirmesi çalışmaz
- Geliştirme sırasında uyumluluk sorunlarını yakalamak için
EnableAotAnalyzerkullanın - Karşılığında yayımlama süresi uzar ve yansıma sınırlamaları oluşur; ancak soğuk başlangıç 5-35 kat hızlanır
Sıkça Sorulan Sorular
“Native AOT Derlemesi” dersi ücretsiz mi?
Evet — “Native AOT Derlemesi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Native AOT Derlemesi” dersinde ne öğreneceğim?
.NET projesinde Native AOT'yi etkinleştirin, kırpma analizini anlayın ve kendi içinde çalışan yerel bir ikili dosya yayımlayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Native AOT Derlemesi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Native AOT Derlemesi
- Kırpma ve Yansıma Sınırlamaları
- ReadyToRun ve Katmanlı Derleme
- BenchmarkDotNet ile Kıyaslama