.NET 7: Zweite Preview erweitert das .NET CLI

Die zweite Vorschauversion gibt Einblicke in geplante Neuerungen in .NET 7. Der Ahead-of-Time-Compiler nähert sich.

Lesezeit: 5 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 6 Beiträge

(Bild: VDB Photos/Shutterstock.com)

Von
  • Dr. Holger Schwichtenberg

Microsoft hat die zweite Vorschauversion von .NET 7 veröffentlicht. Darin finden sich Neuerungen für die Kommandozeilenschnittstelle, ein neuer Quellcodegenerator sowie kleinere Anpassungen für Entity Framework Core 7.0. Der lange erwartete Ahead-of-Time-Compiler nimmt konkretere Formen an und soll in .NET 7 enthalten sein.

Microsoft hat den Befehl dotnet new aus der .NET-Kommandozeilenschnittstelle (.NET CLI), mit dem man neue .NET-Projekte anlegen kann, in zwei Punkten überarbeitet. Zum einen bietet der Befehl nun in den gängigen Shells wie Bash, zsh, fish und PowerShell eine Tabulator-Vervollständigung für die Vorlagennamen. So reicht es, dotnet new c einzugeben, um dann nach Drücken der Tabulator-Taste Vorschläge wie dotnet new classlib und dotnet new console zu erhalten. Ebenso gibt es Vorschläge für Vorlagenoptionen wie --framework, --language und --auth sowie deren Werte. Diese Befehlsvorschläge muss man in einem spezifischen Befehl der jeweiligen Shell aktivieren.

Zum zweiten ist der Kommandozeilenbefehl dotnet new nun konsistenter zu anderen .NET-CLI-Befehlen. Unterbefehle können Entwickler nun auch ohne Parametersyntax aufrufen, zum Beispiel dotnet new list statt dotnet new --list. Die alte Syntax funktioniert aber weiterhin.

Seit .NET 5.0 und C# 9 gibt es bereits Quellcodegeneratoren, die im Rahmen des Kompilierungsvorgangs weiteren Quellcode erzeugen und übersetzen. In .NET 7.0 liefert Microsoft nun in der Klasse System.Text.RegularExpressions.RegexGenerator einen solchen Generator für reguläre Ausdrücke. Dazu schreibt man eine partielle Klasse mit einer partiellen Methode. Die Methode ist mit System.Text.RegularExpressions.RegexGeneratorAttribute zu annotieren, unter Angabe des regulären Ausdrucks und ggf. notwendiger Optionen für den RegEx-Parser. Das Listing zeigt die Anwendung des Quellcodegenerators für zwei reguläre Ausdrücke.

public partial class Checker  
{
 [RegexGenerator(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", RegexOptions.IgnoreCase)]
 public static partial Regex EMailRegEx(); 
 
 [RegexGenerator(@"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$", RegexOptions.IgnoreCase)]
 public static partial Regex GUIDRegEx();
 
 
 public bool IsEMail(string input)
 {
  bool isMatch = EMailRegEx().IsMatch(input);  
  return isMatch;                                      
 }
 
 public bool IsGuid(string input)
 {
  bool isMatch = GUIDRegEx().IsMatch(input);
  return isMatch;
 }
}

Nun sorgt der C#-Compiler dafür, diese partiellen Methoden mit einer Implementierung zu füllen, die deutlich schneller arbeitet als die bisherige Laufzeitkompilierung der regulären Ausdrücke. Den von dem Generator erzeugten Quellcode kann man im Visual Studio-Projekt einsehen unter /Dependencies/Analyzers/ System.Text.RegularExpressions.RegexGenerator/RegexGenerator.g.cs.

Der RegexGenerator ist schon seit Preview 1 in .NET 7 enthalten, Microsoft hatte aber vergessen, das zu verlautbaren.

Im Webframework ASP.NET Core ist nun in sowohl in Controller-Klassen als auch SignalR-Hub-Klassen Dependency Injection bei Methodenparametern möglich. Das nachfolgende Listing zeigt neue Möglichkeiten der Dependency Injection in ASP.NET Core 7.0.

Services.AddScoped<SomeCustomType>();
…
[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    public ActionResult GetWithAttribute([FromServices]SomeCustomType service) => Ok();
    public ActionResult Get(SomeCustomType service) => Ok();
}
…
public class MyHub : Hub
{
    public Task Method(string text, SomeCustomType type) { … }
}

In den in .NET 6 eingeführten Minimal-APIs lassen sich Beschreibungstexte für die OpenAPI Specification per Fluent-API-Methode WithDescription() hinterlegen:

App
.MapGet("/pfad", () => ....)
.WithDescription("OAS-Beschreibungstext zu dieser Operation");

Ebenso ist in Minimal-APIs nun eine Parameterbindung an mehrfach vorkommende Header und Querystrings möglich:

// GET /cities?city=Essen&city=Berlin&city=Rom
app.MapGet("/cities", (string[] names) => $"City 1: {city[0]} , City 2: {city[1]}, City 3: {city[2]}")

In Entity Framework Core 7.0 Preview 2 hat Microsoft die in Version 6.0 eingeführten temporalen Tabellen auch auf Szenarien ausgedehnt, in denen eine Entitätsklasse auf mehrere Datenbanktabellen aufgeteilt ist (Table Splitting alias Owned Entities). Bisher verweigerte der OR-Mapper dies mit der Fehlermeldung "Temporal tables are not supported for table splitting scenario".

Der Code für die durch Schemamigrationen generierten, von der Basisklasse Migration erbenden Klassen schalten nun die lästigen Warnungen des .NET Analyzer aus, dass es keine XML-Kommentare in dem generierten Code gebe. Dazu findet man nun zu Beginn der Datei #pragma warning disable CS159 und am Ende #pragma warning restore CS1591 (siehe GitHub).

Microsoft arbeitet schon seit 2016 als Alternative zu dem Just-in-Time-Compiler an einem Ahead-of-Timer-Compiler, der direkt Machinencode erzeugt und damit .NET-Anwendungen insbesondere schneller starten lässt. Das Projekt war zunächst als "CoreRT" gestartet und wurde 2021 dann in "NativeAOT" überführt. Nachdem der AOT-Compiler schon für .NET 5.0 und .NET 6 angekündigt war (und in .NET 6 lediglich für Blazor WebAssembly geliefert wurde), hat Microsoft den NativeAOT-Code nun in das offizielle GitHub-Repository dotnet/runtime überführt.

.NET 7 Preview 2 enthält aber noch keine SDK-Werkzeuge, um die AOT-Kompilierung anzustoßen. Sie sollen in kommenden Previews nachgeliefert werden. Entwickler können sich schon auf AOT vorbereiten, indem sie prüfen, ob ihre Anwendungen mit dem in .NET 5.0 eingeführten Application Trimming auf Mitgliedsebene funktionieren. Trimming funktioniert bisher allerdings nicht bei Einsatz von Reflection sowie Desktopanwendungen mit WPF und Windows Forms. Das weist auch darauf hin, dass AOT in .NET 7 nicht für alle Anwendungsarten funktionieren wird. Laut einem Eintrag auf GitHub wird es zumindest für WPF- und ASP.NET-MVC-Anwendungen kein AOT in .NET 7 geben, da dort viel mit Reflection gearbeitet wird.

Weitere Informationen zu .NET 7 Preview 2 bietet Microsoft Entwicklerblog. Die Neuerungen in ASP.NET Core sind einem weiteren Blogeintrag zu entnehmen.

(mai)