Neu in .NET 7.0 [17]: Ahead-of-Time-Compiler für Konsolenanwendungen
Der von Microsoft lange Zeit angekündigte Ahead-of-Time-Compiler "Native-AOT" lässt sich erstmalig in .NET 7 nutzen – zumindest in Konsolenprojekten.
- Dr. Holger Schwichtenberg
In .NET 7.0 können Entwicklerinnen und Entwickler erstmalig den schon seit einigen Jahren angekündigten, aber immer wieder verschobenen Ahead-of-Time-Compiler (AOT) für .NET nutzen, der zur Entwicklungszeit Maschinencode erzeugt. Der "Native-AOT" genannte Compiler löst den bisherigen Just-in-Time-Compiler (JIT), der zur Laufzeit Intermediate Language in Maschinencode übersetzt, nicht ab, sondern stellt eine ergänzende Alternative dar – wie die folgende Abbildung verdeutlicht.
Bisher gab es in .NET nur AOT-Kompilierung für Blazor WebAssembly nach WebAssembly-Bytecode (seit .NET 6.0) und die in .NET Core 3.0 eingeführte CrossGen-Technik, bei der eine Assembly partiell schon zur Entwicklungszeit vorkompiliert wird, aber dennoch den gesamten Intermediate Code mitliefert (siehe linke Seite in der Abbildung).
Bedingungen für Native-AOT
Das Kompilieren mit Native-AOT ist nur möglich, wenn es keine Laufzeitcodegenerierung (Reflection Emit), kein dynamisches Assembly-Nachladen mit Assembly.LoadFile(), Assembly.LoadFrom() oder Ähnliches sowie keine Zugriffe auf COM- und WinRT-APIs gibt. Auch das Verwenden von C++/CLI ist nicht möglich. Das Kompilieren dauert deutlich länger und funktioniert in .NET 7.0 zunächst nur mit Konsolenprojekten.
Da immer eine Single-File-Assembly entsteht, funktionieren alle Basisklassenfunktionen nicht, die Einschränkungen bei Single-File-Assemblies haben, beispielsweise Assembly.GetFile(), Assembly.Location, Assembly.CodeBase, Module.Name und weitere.
Mit .NET 8.0 erscheint die nächste Long-Time-Support-Version. Am 21. November 2023 bietet die von Heise und www.IT-Visions.de präsentierte Online-Konferenz betterCode() .NET 8.0 das Rüstzeug, sich einen grundlegenden Überblick zu .NET 8.0 zu verschaffen. Die Expertenvorträge zeigen die Neuerungen in .NET 8.0, ASP.NET Core 8.0, Blazor 8.0, .NET MAUI, C# 12.0 und mehr. Vier ganztägige Workshops vermitteln Hands-on-Wissen.
Aktivieren von Native-AOT
Native-AOT lässt sich mit dem Eintrag <PublishAot>true</PublishAot>
in der Projektdatei aktivieren. Danach ist eine Veröffentlichung mit Runtime Identifier möglich, beispielsweise folgendermaßen:
dotnet publish -r win-x64 -c Release
oder
dotnet publish -r linux-arm64 -c Release
Ausblick
Im nächsten Teil dieser Serie, der in der kommenden Woche erscheinen wird, geht es um die Geschwindigkeit von AOT-kompilierten Anwendungen im Vergleich zu Anwendungen mit JIT.
(map)