.NET 8.0'da yeni [33]: AOT derleyicisinin genişlemesi
.NET 7.0 ile Microsoft, ilk kez bir derleyici affetme (AOT) sağlar, bu da çalışma zamanı için tam zamanında derleme olmadan makine kodundaki .NET uygulamalarını tam olarak teslim etmenizi sağlar. Ancak, “Native AOT” olarak adlandırılan derleyici, yalnızca konsol uygulamalarını .NET 7.0'a çevirebildi.

Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.
.NET 8.0'dan beri, aşağıdaki uygulama türleri artık AOT derleyicisinde de mümkündür:
- Temel Hizmetler (İşçi Hizmetleri)
- GRPC Hizmetleri
- Kısıtlamaları olan Webapis: WebAPIS ile sadece “minimal Webapi” adlı model mümkündür, System.Text.Json Jeneratör menşe modunda.

.NET 8.0'da doğal AOT'de desteklenen çekirdek ASP.NET işlevselliği
(Resim: Microsoft)
Not: Yerel AOT, başlangıç zamanını ve RAM gereksinimini azaltmanın en gerekli olduğu yerde çalışmaz: Windows ve WPF modülleri.
Origin jeneratörü System.Text.Json Microsoft'u genişletti, böylece şimdi yansıma tabanlı mod gibi neredeyse tüm yapılandırma seçeneklerini biliyor. Buna ek olarak, Origin jeneratörü artık C# 9.0'daki başlangıç başlatma özellikleri ve C# 11.0'ın gerektirdiği özellik ile birlikte çalışıyor. Eski yansıma yolu bir proje ayarı ile tamamen devre dışı bırakılabilir. Durum modu kontrol eder
if (JsonSerializer.IsReflectionEnabledByDefault) { … }
Proje modellerinde yeni yerel AOT seçeneği
.NET 8.0'da yeni, bazı proje modellerinin artık komut satırı seçeneğiyle doğrudan AOT derleyicisine mümkün olmasıdır. —aot Veya Visual Studio'da bir onay işareti ile etkinleştirmek için:
- Konsolun Uygulaması: dotnet new console –aot
- İşçi Hizmeti: dotnet new worker –aot
- GRPC: dotnet new grpc –-aot

-AOT parametresi DotNet için mevcuttur.
(Resim: Foglio ekranı (Holger Schwichtenberg)))

Visual Studio'da GRPC Hizmetleri için Proje Modeli yerel bir AOT seçeneği sunar.
(Resim: Ekran görüntüsü (Holger Schwichtenberg))
ASP.NET Core Webapis (kısa WebApi adı) için proje modeli için bir seçenek yok —aot Ve Visual Studio'da bir onay işareti değil. Burada Microsoft, kısa bir WebPiaot adıyla kendi proje modeli “ASP.NET Core Webapi (Native AOT)” oluşturmaya karar verdi. Bu, örneği WebAPI proje modelinde daha önce yaygın meteorolojik verilerle değil, bir etkinlik listesi kullanmaz.

Visual Studio'daki Webapi Proje Modelleri arasında yerli AOT için bir tane var.
(Resim: Ekran görüntüsü (Holger Schwichtenberg))
Normal minimum WebAPI modelindeki farklılıklar:
- WebApplication.CreateSlimBuilder() yerine CreateBuilder()
- Kaynak üreticisi aracılığıyla json seri
using System.Text.Json.Serialization;
namespace MinimalWebAPI_AOT;
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});
var app = builder.Build();
var sampleTodos = new Todo[] {
new(1, "Walk the dog"),
new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
new(4, "Clean the bathroom"),
new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());
app.Run();
}
}
public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);
[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Not: Alternatif olarak, proje dosyasındaki yerel AOT derleyicisini daha önce olduğu gibi etkinleştirebilirsiniz:
<PublishAot>true</PublishAot>
ve yapılandırın:
<IlcOptimizationPreference>Speed</IlcOptimizationPreference>
VEYA:
<IlcOptimizationPreference>Size</IlcOptimizationPreference>
Aynı zamanda dotnet publish AOT Native hala etkinleştirilebilir:
dotnet publish -r win-x64 -c Release -p
Uyumsuz koddaki uyarılar
Bir çekirdek ASP.NET projesi için AOT derleyicisini etkinleştirdiyseniz, AOT derleyicisiyle uyumlu olmayan yöntemler çağrıldığında 8.0 uyarısı aldınız:

Uyarı, model ekran denetleyicisinin çerçevelerini etkinleştirme çağrısının derleyici ile kendi başlarına mümkün olmadığını gösterir.
(Resim: Ekran görüntüsü (Holger Schwichtenberg))
Apple işletim sistemleri için yerli
Microsoft, yeni .NET-NITA-AOT derleyicisini kullanarak iOS, MAC Catalyst ve TVO'lar için .NET 8.0, .NET uygulamalarından derledi. Bu seçenek, bu platformlar (iOS için .NET) ile sınırlı uygulamalar ve çok platform uygulaması .NET (.NET maui) kullanıcı arayüzü için kullanılabilir. Sonuç olarak, uygulamalar artık mono üzerinde çalışmıyor ve “iOS için .NET” için uygulama paketleri önemli ölçüde daha kompakt hale geliyor. Öte yandan, .NET Maui için uygulama paketleri boyutlarında bir artışa sahiptir.
Bir blog yayınında Microsoft, şirketin sorunu tanıdığını ve yaklaşık yüzde 30'luk bir boyuta yol açması gereken bir çözüm üzerinde aktif olarak çalıştığını doğruladı.

Tablo, doğal AOT tarafından uygulama paketlerinin azaltılmasını göstermektedir.
(Resim: Microsoft)
Olası operasyonlar ve AOT'de mümkün değil
Veritabanına erişim, AOT derleyicisi için, nesnelerle ilgili temel çerçeve haritacı varlığı ile henüz mümkün değildir, çünkü bu hala çalışma zamanı derlemesini kullanır. Aynı şey .NET dünyasında, mikro yıldızlı Depper'deki en önemli ikinci veya dünya dünyası için de geçerli. AOT Compact uygulamalarında, geliştiriciler şu anda yalnız olabilir DataReader,, DataSet ve Ado.net veya GitHub Nanorm projesinden komut nesnelerini kullanın.

BetterCode Online Konferansı () .NET 9.0'ın 19 Kasım 2024'ünde IX ve DPAT.verlag tarafından. Bunlar. Program altı ders, tartışma ve altı seminer sunuyor.
Biletler 22 Ekim'e kadar erken bir kuş ödülünde mevcuttur.
Yukarıda listelenen uygulama türlerinden biri oluşturulmuş olsa bile, .NET 8.0'daki AOT yerli ile aşağıdakiler mümkün değildir:
- Kodun Kodu Kodu (yansıtmaya yayılıyorum)
- Dinamik Montaj Şarjı (Ek Bileşenler/Eklenti)
- Bileşen Nesne Modeli (COM)
- Windows Çalışma Zamanı API (WinRT)
- Windows Yönetimi Enstrümantasyonu (WMI)
- Active Directory Hizmetlerine Erişim
- C ++/CLI
- İnternet Bilgi Hizmetlerinde Webapis ile AOT (IIS)
- Varlığın Çerçeve Çekirdeği
- Canım
- Json.net ile json seri (newtonsoft json)
- Otomobil ve diğer birçok üçüncü taraf kitapçısı
- Düzenli İfadeler
- Dosya sistemine erişim
- System.text.json ile json seri
- Açık
- Nanma
- Microsoft Bağımlılık Enjeksiyon Konteyneri ile Bağımlılık Enjeksiyonu (Microsoft.Extensions.DependencyInjection) VE AutoFac
.NET 8.0 için Microsoft, yerel-AOT derleyicilerinin Webapis üzerindeki etkileri hakkında rakamlar yayınladı. Aşağıdakileri grafikte görebilirsiniz:
- Derlemenin boyutu, özellikle Linux ve başlangıç zamanı için RAM gereksinimi çok daha düşüktür.
- Ne yazık ki, yürütme hızı da biraz azalır, çünkü AOT yerel kodu ikinci (RPS) için daha az istek oluşturur.

Grafik, doğal AOT derleyicisinin performans üzerindeki etkisini gösterir.
(Resim: Microsoft)
(RME)