.NET 10 Native AOT Nedir? Gerçek Bir Projede Neler Değişiyor?
.NET 10 Native AOT Nedir ? C#'da Değişenler Neler ? Projenin Performansındaki Etkileri Nelerdir ?

.NET 10 ve Native AOT Rehberi: Çalışma Mantığı ve Gereksinimler
Merhaba, ben Yasin Akmaz. Bu yazımda C#'ın Native AOT (Ahead-Of-Time) çalışma yapısını ve bir C# projesini Native AOT ile uyumlu hale getirmek için bilmeniz gereken temel gereksinimleri detaylıca ele alacağız.
Native AOT Nedir?
Native AOT, C# kodunuzun ara bir dile (IL - Intermediate Language) ihtiyaç duymadan, derleme aşamasında doğrudan hedef platformun makine koduna (LLVM/ILCompiler altyapısı aracılığıyla) dönüştürülmesini sağlayan bir teknolojidir.
Bu sayede uygulamanız, hedef makinede bir .NET Runtime (çalışma zamanı) veya SDK bulunmasına gerek kalmadan, bağımsız bir executable (çalıştırılabilir dosya) olarak yüksek performansla çalışır.
JIT (Just-In-Time) Derleme Nasıl Çalışır?
Geleneksel C# projelerinin büyük bir kısmı JIT tabanlıdır. Peki bu ne anlama geliyor?
Uygulamanızı geliştirdikten sonra production ortamına almak için projeyi Release modunda derlersiniz. Release derleme süreci kodunuzu optimize eder ancak kod doğrudan makine diline dönüşmez; IL koduna çevrilir. Uygulama çalıştırıldığında (runtime anında), JIT derleyici bu IL kodlarını o anki sistemin anlayacağı makine koduna dönüştürür.
Ayrıca popüler birçok C# kütüphanesi (Dapper, EF Core, Swagger vb.) çalışma zamanında dinamik kod üretimi (Reflection/Emit) yapar.
JIT ve Dinamik Kod Üretiminin Yan Etkileri:
Yüksek Bellek (RAM) Kullanımı: JIT derleyicisinin kendisi bellekte ek yük oluşturur.
Cold Start (İlk Çalışma) Gecikmesi: Uygulama başlarken kodların çalışma anında derlenmesi zaman alır.
Garbage Collector (GC) Yükü: Dinamik nesne üretimi GC üzerindeki baskıyı artırarak yanıt sürelerinin (latency) uzamasına neden olabilir.
Çözüm: Native AOT Mekanizması
Native AOT, tam da bu performans kayıplarını gidermek için devreye girer. Geleneksel JIT yaklaşımının aksine Native AOT, tüm bağımlılıkları ve kod bloklarını derleme zamanında (Build-Time) çözer ve makine koduna dönüştürür.
⚠️ Kritik Kural: Native AOT, çalışma zamanında (Runtime) dinamik kod üretilmesini kesinlikle desteklemez.
Dinamik Kod Desteklenmiyorsa Kütüphane Seçimi Nasıl Olmalı?
Dinamik kod üretiminin desteklenmemesi, alışkın olduğumuz bazı geleneksel kütüphane ve yöntemlerden vazgeçmemiz gerektiği anlamına gelir.
Dapper: Her ne kadar Dapper.AOT gibi paketler geliştirilse de, Dapper'ın çalışma anında tipleri eşleyen (mapping) alışageldik birçok dinamik özelliğini AOT projelerinde kullanamazsınız.
Entity Framework Core (EF Core): Static Query mekanizması gibi AOT öncelikli çalışmalar bulunsa da, EF Core'un yoğun Reflection kullanan yapısı nedeniyle AOT projelerinde tam uyum sağlamak oldukça güçtür.
Hangi Paketleri Tercih Etmeliyiz?
Kullanacağınız paketlerin runtime'da dinamik kod üretmediğinden emin olmanız gerekir. Microsoft, .NET ekosistemindeki System.* ve Microsoft.* altındaki ana kütüphanelerin büyük bir kısmını AOT-safe (AOT uyumlu) hale getirmiştir.
C# Tarafında Native AOT Destekleyen Teknolojiler
Native AOT her proje tipi için doğrudan uygun değildir. Şu anki ekosistemde durum şu şekildedir:
✅ Desteklenen Proje Tipleri
Console Applications
Worker Services
ASP.NET Core Minimal API
Blazor Client-Side (WebAssembly / WASM)
❌ Henüz Desteklenmeyen Proje Tipleri
Server-Side web teknolojileri genel olarak desteklenmez. Özellikle CSHTML yapısına dayanan ve çalışma zamanında HTML/kod üreten mimariler AOT ile uyum sağlamaz:
Server-Side Blazor
ASP.NET Core MVC / Web App (Razor Pages)
.NET MAUI Tarafında Native AOT Durumu
MAUI projelerinde AOT desteği hedef platforma göre değişiklik gösterir:
iOS ve macOS: Apple ekosisteminde AOT varsayılan olarak desteklenir ve stabil çalışır.
Android: Android tarafında şu anda Native AOT yerine Mono Android yapısı kullanılmaktadır. Native AOT üzerine çalışmalar sürse de, doğru yapılandırılmadığında uygulama çökebilir veya açılmayabilir.
Windows (WinUI 3): WinUI 3 altyapısı AOT desteklese de, XAML tarafında ObservableCollection gibi runtime mekanizmalarına dayanan veri bağlama (Data Binding) işlemleri sorun çıkarabilir. XAML'ın runtime bağımlılıkları nedeniyle listeler görünmeyebilir veya uygulama kilitlenebilir.
Özet: Native AOT Uyumlu Kod Nasıl Yazılır?
Projenizin Native AOT ile sorunsuz çalışması için şu 3 temel kurala dikkat etmelisiniz:
Dinamik Kod Üretiminden Kaçının: Çalışma zamanında Reflection veya System.Reflection.Emit kullanan kodları ve kütüphaneleri projeden uzak tutun.
System.Text.Json Source Generators Kullanın: JSON serileştirme işlemlerini dinamik yapmak yerine, derleme zamanında JSON tiplerini işleyen JsonSerializerContext (Source Generation) yapısını tercih edin.
dynamic Veri Türünü Kullanmayın: C#'taki dynamic anahtar kelimesi runtime tiplerine dayandığı için AOT süreçlerinde kesinlikle kullanılmamalıdır.
Bu kurallara dikkat ettiğiniz sürece .NET 10 ile Native AOT'nin sunduğu milisaniyelik açılış sürelerinden ve minimum bellek tüketiminden tam anlamıyla yararlanabilirsiniz.
İşte hazırsınız, Native AOT dünyasına adım atabilirsiniz!
Bu içerik yararlı oldu mu?