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.

In Pocket speichern vorlesen Druckansicht 6 Kommentare lesen

(Bild: Connect world/Shutterstock.com)

Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg
Inhaltsverzeichnis
Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

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.

Native-AOT ist in .NET 7.0 eine Alternative zum Just-In-Time-Compiler – aber nur für Konsolenanwendungen.

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).

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.

Heise-Konferenz: betterCode() .NET 8.0
betterCode() .NET 8.0, Online-Konferenz, 21. November 2023

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.

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

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)