Zum Hauptinhalt Zur Navigation

Microsoft: .NET 7 verbessert Kommandozeile und Performance

Im knappen Monatsrhythmus veröffentlicht Microsoft Previews für das kommende .NET 7. Im Fokus stehen derzeit Startzeit, CLI und natives AOT-Kompilieren.
/ Fabian Deitelhoff
2 Kommentare News folgen (öffnet im neuen Fenster)
.Net 7 soll die Leistung verbessern. (Bild: Pixabay/Montage: Golem.de)
.Net 7 soll die Leistung verbessern. Bild: Pixabay/Montage: Golem.de

Die .NET-Welt dreht sich aktuell sehr schnell. Der Support für .NET 5 endet bereits am 8. Mai 2022, da es sich bei dieser Version um ein sogenanntes Current Release handelt. .NET 6 bekommt als LTS-Release (Long Term Support) noch Unterstützung bis Anfang November 2024. Mittendrin veröffentlicht Microsoft fleißig Preview-Versionen von .NET 7, ebenfalls ein Current Release. Damit bekommt diese Version aber auch nur 18 Monate Support und Patches ab dem Veröffentlichungsdatum.

Das führt gefühlt zu vielen Änderungen beim .NET Framework. Jedes Preview beinhaltet viele kleine und große Anpassungen in der Breite, mit jeweils etwas anderen Schwerpunkten im Detail. Preview 2(öffnet im neuen Fenster) legt den Fokus auf das .NET CLI, während sich Preview 3(öffnet im neuen Fenster) auf die Startzeit fokussiert.

Updates in der zweiten und dritten Preview

Gegenüber der ersten Preview liegt der Schwerpunkt der Anpassungen in der zweiten Vorabversion auf neuen Möglichkeiten für reguläre Ausdrücke, Anpassungen bei der Code-Generierung, bei einem NativeAOT genannten Feature und bei der .NET CLI.

Die erweiterten Möglichkeiten bei den regulären Ausdrücken beziehen sich primär auf den neuen Regex Source Generator(öffnet im neuen Fenster) . Dieser bietet die Vorteile bei der Performance, ohne die Kosten beim Starten der spezialisierten Engine zu haben. Zudem werden gute Debugging-Möglichkeiten geboten.

Der neue Generator bietet Vorteile, wenn das Regex-Muster zum Zeitpunkt des Kompilierens bekannt ist. Diese Neuerungen lassen sich nutzen, wenn der reguläre Ausdruck als partieller Typ hinterlegt und mit dem RegexGenerator -Attribut ausgestattet wird. Diese partielle Methode, die wir auf diese Weise definieren und annotieren, wird vom Generator automatisch auf Basis unseres Musters implementiert.

Die Methode können wir in unserem eigenen Code nutzen, um auf das Muster beziehungsweise die Ergebnisse zuzugreifen. Hier ein kurzes Beispiel:

        

public partial class GolemRegex
{
  [RegexGenerator(@"golem|regex", RegexOptions.IgnoreCase)]
  public static partial Regex OurGolemRegex();

  public bool GolemMatches(string input)
  {
    bool isMatch = OurGolemRegex().IsMatch(input);

    // ..
  }
}

Die Klasse ist als partial deklariert, ebenso wie die Methode, die über das RegexGenerator -Attribut annotiert wird. In der Methode mit der Businesslogik kann auf die Ergebnisse des Musters zugegriffen werden. Die Implementierung der partiellen Methode wird durch den Generator automatisch aktualisiert, wenn wir das Muster anpassen oder andere Regex-Optionen übergeben.

Reklame

C# und .NET 6 - Grundlagen, Profiwissen und Rezepte

Jetzt bestellen bei Amazon (öffnet im neuen Fenster)

Auf diese Weise bekommen wir eine kompilierte Regex-Engine, abgestimmt auf unser Muster, ohne diese Engine erst zur Laufzeit erzeugen zu müssen, was auf die Performance geht. Der neue Generator führt alle Schritte bereits beim Kompilieren durch.

Zudem gab es etliche Anpassungen beim Command Line Interface (CLI)(öffnet im neuen Fenster) für .NET. Das Kommando dotnet new hat eine konsistentere und intuitivere Schnittstelle bekommen, um die Nutzung der Unter-Kommandos zu vereinfachen. Darüber hinaus ist das Feature, die Autovervollständigung durch Tab, deutlich verbessert und erweitert worden. Das betrifft insbesondere die Autovervollständigung für Template-Optionen und Argumente.

Des Weiteren ist das NativeAOT-Projekt(öffnet im neuen Fenster) , was für Ahead-of-time (AOT) steht, wie in der ersten Preview angekündigt, nicht mehr im experimentellen Status. Es befindet sich damit nicht mehr im experimentellen Repository des .NET Runtime Labs(öffnet im neuen Fenster) , sondern im offiziellen Repository der .NET Runtime(öffnet im neuen Fenster) .

.NET 7 - Die nächste Evolution?

Was noch fehlt, ist die wichtige first-class-Unterstützung im .NET SDK, um Projekte mit NativeAOT zu veröffentlichen, die mit der dritten Preview von .NET 7 einen Schritt näher gerückt ist. NativeAOT bringt in Zukunft das native Kompilieren von .NET-Assemblies für Desktop Client- und Server-Szenarios.

Es ersetzt die aktuell vorhandenen ReadyToRun-Technologien(öffnet im neuen Fenster) nicht, eröffnet aber in einigen Szenarien erweiterte Funktionalitäten und Möglichkeiten. Das betrifft zum Beispiel die Startzeit von Anwendungen, den Speicherverbrauch oder den Zugriff auf aktuell eingeschränkte Plattformen, die kein Just in Time (JIT) beim Kompilieren erlauben.

Als Trade-off stehen nicht alle Funktionen bei NativeAOT zur Verfügung, wie zum Beispiel das Erzeugen neuen Codes zur Laufzeit über System.Reflection.Emit . Zusätzlich sind Entwickler selbst dafür verantwortlich, dass für alle abzudeckenden Plattformen die nativen Binaries einer Anwendung zur Verfügung stehen. Das übernimmt .NET dann nicht mehr beim Starten.

Da die Performance in .NET 7 ein wichtiger Punkt war und ist, gibt es hier ebenfalls einige Verbesserungen. Das betrifft den Write-Xor-Execute -Modus, bei dem die Anzahl der notwendigen Änderungen nach der Erstellung des ausführbaren Codes deutlich reduziert wurden. Die Performance soll um 10 bis 15 Prozent besser sein. Diese eingeführte Technik verhindert, dass Speicherbereiche nur beschreibbar oder ausführbar sein dürfen, aber nicht beides (Write-Xor-Execute, W^X).

.NET 7 lässt sich bereits heute als Grundlage eigener Anwendungen testen. Die Preview-Versionen sind dabei offensichtlich nicht für produktive Anwendungen geeignet. Um .NET 7 in einem Projekt verwenden zu können, ist ein Target Framework Moniker (TFM) für diese Version notwendig:

    ᐸTargetFrameworkᐳnet7.0ᐸ/TargetFrameworkᐳ

Diese TFMs für .NET 7 gibt es für Android, iOS, MacOS, Mac Catalyst, TvOS und Windows. Laut Aussagen von Microsoft wird erwartet, dass der Umstieg von .NET 6 auf Version 7 problemlos erfolgen soll. Wer diesen Umstieg testen möchte, sollte einen Blick auf die Breaking Changes(öffnet im neuen Fenster) werfen. Diese sind, gruppiert nach Technologie, auf der Webseite aufgeführt - inklusive Information darüber, ob es eine Kompatibilität auf Source-Code- beziehungsweise Binär-Datei-Ebene gibt oder eben nicht.

Ein Issue auf Github(öffnet im neuen Fenster) fasst weitere problematische Unterschiede zur neuen .NET-Version zusammen. Auch diese Infos und die Diskussionen in den Kommentaren darunter sind einen Blick wert.

Reklame

C# und .NET 6 - Grundlagen, Profiwissen und Rezepte

Jetzt bestellen bei Amazon (öffnet im neuen Fenster)

Fazit

Mit .NET 7 soll sich im .NET-Universum einiges verändern. Microsoft arbeitet bei den Preview-Versionen im großen Umfang daran, zahlreiche Funktionen nachzurüsten und Ecken und Kanten zu glätten. Das betrifft nicht nur den Kern von .NET, sondern auch die verschiedenen Technologien rund um das Framework wie ASP.NET Core, Entity Framework, ML.NET, .NET MAUI , Windows Forms, Windows Presentation Foundation (WPF), Roslyn und viele weitere Technologien.

Ob die Roadmap und der Zeitplan eingehalten werden können, bleibt abzuwarten. Zu wünschen ist Microsoft, dass im November 2022 die neue Version von .NET inklusive C# erscheint, damit die Neuerungen flächendeckend zum Einsatz kommen können.

Fabian Deitelhoff(öffnet im neuen Fenster) arbeitet als Tech-Lead Domestics an Cloud-Themen bei Miele. Darüber hinaus ist er mit Brickobotik(öffnet im neuen Fenster) in der MINT-Bildung und mit Loosely.Ruhr(öffnet im neuen Fenster) in der Cross-Plattform-Softwareentwicklung tätig. Daneben arbeitet er als freier Autor, Dozent und Softwareentwickler im .NET- und Web-Umfeld.


Relevante Themen