.NET 8.0'daki yenilikler [33]: AOT derleyici uzantısı

Womanne

Member


  1. .NET 8.0'daki yenilikler [33]: AOT derleyici uzantısı

.NET 7.0 ile Microsoft ilk kez bir gelişmiş derleyici (AOT) sağlıyor; bu, .NET uygulamalarının çalışma zamanında tam zamanında derleme olmadan tamamen makine kodunda teslim edilmesine olanak tanıyor. Ancak “Native AOT” isimli derleyici yalnızca .NET 7.0'da konsol uygulamalarını derleyebiliyordu.


Duyuru








Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla danışmanlık, eğitim ve yazılım geliştirme yoluyla çok sayıda orta ve büyük ölçekli şirketi destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.







AOT derleyicisi ile .NET 8.0'dan itibaren aşağıdaki uygulama türleri de artık mümkündür:

  • Arka Plan Hizmetleri (Çalışan Hizmetleri)
  • gRPC hizmetleri
  • Sınırlı WebAPI: WebAPI'lerle yalnızca “Minimal WebAPI” adı verilen model mümkündür, JSON serileştirmesi System.Text.Json kaynak jeneratör modunda.
Aşağıdaki şekil ek kısıtlamaları göstermektedir:




ASP.NET Core özellikleri desteklenir



.NET 8,0'da yerel AOT'da desteklenen ASP.NET Core özellikleri


(Resim: Microsoft)



Not: Yerel AOT, önyükleme süresini ve RAM gereksinimlerini azaltmak için en çok ihtiyaç duyulan yerde hala çalışmıyor: Windows Forms ve WPF.

Kaynak jeneratörü System.Text.Json Microsoft, artık yansıma tabanlı mod gibi neredeyse tüm yapılandırma seçeneklerini bilecek şekilde genişletti. Ek olarak kaynak oluşturucu artık C# 9.0 Init Only özellikleri ve C# 11.0 Required özellikleriyle birlikte çalışıyor. Eski yansıma modu bir proje ayarı kullanılarak tamamen kapatılabilir. Mod durumu kontrol eder

if (JsonSerializer.IsReflectionEnabledByDefault) { … }
Proje şablonlarında yeni yerel AOT seçeneği


.NET 8.0'daki bir diğer yeni özellik ise bazı proje şablonları için artık AOT derleyicisini doğrudan komut satırı seçeneğiyle kullanabilmenizdir. —aot veya Visual Studio'da bir onay işaretiyle etkinleştirin:

  • Konsol Uygulaması: dotnet new console –aot
  • İşçi Hizmeti: dotnet new worker –aot
  • gRPC: dotnet new grpc –-aot



Parametreler --aot



–aot parametresi dotnet new için mevcuttur.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))





Ekran görüntüsü: Yerel AOT seçeneği



Visual Studio'da gRPC Hizmetleri proje şablonu yerel bir AOT seçeneği sunar.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))



ASP.NET Core WebAPI (kısa ad webapi) proje şablonu için herhangi bir seçenek yoktur. —aot ve Visual Studio'da onay işareti yok. Burada Microsoft, webapiaot kısa adıyla kendi proje şablonunu “ASP.NET Core WebAPI (yerel AOT)” oluşturmaya karar verdi. Daha önce WebAPI proje şablonunda kullanılan hava durumu verileri örneğini kullanmaz, bunun yerine yapılacaklar listesini kullanır.




Yeni Proje ekranı



Visual Studio'daki WebAPI proje şablonları arasında yerel AOT için bir tane vardır.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))



Normal Minimal WebAPI modeliyle karşılaştırıldığında farklar şunlardır:

  • WebApplication.CreateSlimBuilder() yerine CreateBuilder()
  • Kaynak oluşturucu aracılığıyla JSON serileştirmesi
Aşağıdaki kod, hava durumu tahmini yerine yapılacaklar listesini döndürür:


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, daha önce olduğu gibi, yerel AOT derleyicisini daha sonra proje dosyasındaki etiketler aracılığıyla da etkinleştirebilirsiniz:

<PublishAot>true</PublishAot>

ve yapılandırın:

<IlcOptimizationPreference>Speed</IlcOptimizationPreference>

VEYA:

<IlcOptimizationPreference>Size</IlcOptimizationPreference>

Ayrıca dotnet publish Yerel AOT hâlâ etkinleştirilebilir:

dotnet publish -r win-x64 -c Release -p:publishAOT=true
Uyumsuz kod uyarıları


.NET 8.0'dan itibaren, ASP.NET Core projesi için AOT derleyicisini etkinleştiren herkes, AOT derleyicisiyle uyumlu olmayan yöntemleri çağırırken uyarı alacaktır:







Uyarı, model-view-controller çerçevesini etkinleştirmek için AddControllers() işlevinin çağrılmasının eski derleyiciyle mümkün olmadığını gösterir.


(Resim: Ekran görüntüsü (Holger Schwichtenberg))



Apple işletim sistemleri için yerel AOT


.NET 8.0'dan başlayarak Microsoft, yeni .NET Native AOT derleyicisini kullanarak iOS, Mac Catalyst ve tvOS için .NET uygulamalarının derlenmesini mümkün kıldı. Bu seçenek, hem bu platformlarla sınırlı uygulamalar (iOS için .NET) hem de .NET platformlar arası uygulama kullanıcı arayüzü (.NET MAUI) için kullanılabilir. Sonuç olarak uygulamalar artık Mono üzerinde çalışmıyor ve “.NET for iOS” uygulama paketleri önemli ölçüde daha kompakt hale geliyor. Öte yandan .NET MAUI uygulama paketlerinin boyutu büyüyor.

Bir blog yazısında Microsoft, şirketin sorunu fark ettiğini ve yaklaşık %30'luk bir ölçek avantajı sağlayacak bir düzeltme üzerinde aktif olarak çalıştığını doğruladı.







Tablo, uygulama paketi boyutundaki yerel AOT azalmasını göstermektedir.


(Resim: Microsoft)



AOT'de olası ve mümkün olmayan işlemler


Entity Framework Core nesne ilişkisel eşleyicisini kullanan AOT derleyicisi hala çalışma zamanı derlemesini kullandığından veritabanına erişim henüz mümkün değildir. Aynı şey .NET dünyasının ikinci en önemli OR eşleyicisi olan Micro-ORM Dapper için de geçerlidir. AOT derlenmiş uygulamalarda geliştiriciler şu anda yalnızca DataReader, DataSet ve ADO.NET veya NanORM GitHub projesindeki komut nesnelerini kullanın.






19 Kasım 2024'te iX ve dpunkt.verlag tarafından düzenlenecek BetterCode() .NET 9.0 çevrimiçi konferansında, www.IT-Visions.de'nin .NET uzmanları (bu blog yazısının yazarı dahil) .NET'in son durumunu sunacak. NET 9.0'ın pratik örnekleri. Bunlar arasında .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, Windows Forms 9.0, WPF 9.0, WinUI, .NET MAUI 9.0'daki yenilikler ve yapay zekanın .NET uygulamalarına entegrasyonu yer alıyor. Programda altı ders, bir tartışma ve altı atölye çalışması yer alıyor.

Erken kayıt biletleri 22 Ekim'e kadar geçerlidir.







Yukarıda listelenen uygulama türlerinden birini oluştursanız bile, .NET 8.0'da bile yerel AOT ile aşağıdakiler mümkün değildir:

  • Çalışma Zamanı Kodu Oluşturma (Yansıma Yayma)
  • Montajların dinamik olarak yeniden yüklenmesi (eklentiler/eklentiler)
  • Bileşen Nesne Modeli (COM)
  • Windows Çalışma Zamanı API'si (WinRT)
  • Windows Yönetim Araçları (WMI)
  • Active Directory hizmetlerine erişim
  • C++/CLI
  • İnternet Bilgi Hizmetlerinde (IIS) WebAPI ile AOT
  • Varlık çerçevesinin özü
  • Zarif
  • JSON.NET ile JSON Serileştirme (Newtonsoft JSON)
  • AutoMapper ve diğer birçok üçüncü taraf kitaplığı
Ancak diğer şeylerin yanı sıra bazı şeyler de mümkündür

  • Düzenli ifadeler
  • Dosya sistemi erişimleri
  • System.Text.Json ile JSON serileştirmesi
  • AÇIK
  • NanoRM
  • Microsoft Dependency Injection Container ile Bağımlılık Enjeksiyonu (Microsoft.Extensions.DependencyInjection) VE AutoFac
Yerel AOT performansı


.NET 8.0 için Microsoft, yerel AOT derleyicisinin WebAPI'ler üzerindeki etkisini gösteren verileri yayımladı. Grafikte aşağıdakileri görebilirsiniz:

  • Yapı boyutu, RAM gereksinimi (özellikle Linux'ta) ve başlatma süresi önemli ölçüde azalır.
  • Ne yazık ki, yerel AOT derlenmiş kodunun saniyede daha az istek (RPS) oluşturması nedeniyle yürütme hızı da biraz düşüyor.






Grafik, yerel AOT derleyicisinin performans üzerindeki etkisini göstermektedir.


(Resim: Microsoft)




(Ben)
 
Üst