Ab .net 8.0 Version gibt es für Asp.Net Core ein native AOT Template, welches Standard-mäßig folgende Änderungen vornimmt.
- CreateSlimBuilder() Extension nur unbedingt nötige Features (Logging/Configuration) werden hinzugefügt
- http Verbindungen werden unterstützt
- Keine Launch Profile für IIS oder IIS Express (nur noch http)
- fügt folgende xml Node in die csproj Datei hinzu
true
- Support für Json Serializer Code Generator
Ich habe dieses Template benutzt (Asp.Net Core Web Api (native AOT):
Folgender Code kommt dabei raus:
Program.cs
using System.Text.Json.Serialization;
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
{
}
Wie man sieht, ist es nicht mehr der Wetter-Forecast Controller, sondern es sind die ToDo Items. Ohne die letzten Zeilen Code (Vererbung JsonSerializerContext) würde AOT nicht funktionieren. Das liegt daran, dass Reflektion bei der AOT nicht mehr funktioniert, da der ganze JIT-Prozess entfällt und nur noch Maschinencode vorliegt. Später dazu mehr, wenn es um die Limitierungen geht.
Wichtig:
Folgendes Visual Studio Workload Package muss installiert sein:
Danach dann einfach mit der Console in das Projektverzeichnis wechseln und folgenden Befehl ausführen:
PS C:\Users\Markus.Wegner\source\repos\WebApiAot> dotnet publish webapiaot.sln -r win-x64 -c Release
Wichtig: Angabe der Runtime (-r win-x64)
Wenn man das gemacht hat, wird nur eine einzige Datei erzeugt. Diese kann man starten und ist völlig unabhängig von externen Abhängigkeiten, wie man es sonst so gewohnt ist.
So sieht das Verzeichnis danach aus:
Einfach die WebApiAot.exe starten und eine Abfrage starten:
Ich finde das sehr beeidruckend, weil man einfach nur die exe nimmt und diese auf irgendeinem Windows X64 Rechner starten kann und es funktioniert. Es braucht halt keine externen Abhängigkeiten wie das .Net Framework oder oder oder.
Limitierungen:
- Kein dynamisches Assembly Laden àLoadFile
- Kein Code-Generierung via System.Reflecton.Emit
- Keine Unterstützung von Linq.Expressions die zur Laufzeit kompiliert werden
- Und weitere
Das bedeutet, dass man vorher überprüfen muss, ob meine Anwendung und deren Abhängigkeiten, AOT kompatible sind. Das kann schon sehr anstrengend werden. Aber um eine kleine Api im internen Netzwerk zur Verfügung zu stellen ist das sicherlich eine sinnvolle Sache.