Microsoft läutet mit .NET Core 3.0 und C# 8.0 neues Zeitalter ein

Seite 2: Neue Verbreitungswege

Inhaltsverzeichnis

Insbesondere in Hinblick auf die wiederentdeckte Desktop-Welt bietet .NET Core neue Deployment-Funktionen. Eine .NET-Core-Anwendung erzeugt nun direkt beim Kompilieren eine .exe-Datei, nicht wie bisher erst beim Publish-Befehl. In einem Single-File Executable bündeln Entwickler alle zu einer Anwendung notwendigen DLLs und weitere Dateien zu einer .exe-Datei zur vereinfachten Weitergabe. Allerdings findet hier nicht wie ursprünglich angekündigt ein Tree Shaking statt: Die EXE ist nur ein gepacktes Archiv aller Dateien, das beim Start nach C:\Users\xy\AppData\Local\Temp\.net\ entpackt wird.

Mit dem optionalen Einsatz des IL Linker aus Mono können .NET-Core-Entwickler immerhin DLLs im Deployment-Paket loswerden, die gar nicht gebraucht werden. Sofern Reflection oder andere dynamische Techniken verwendet werden, müssen Entwickler aber dem Linker bei der Erkennung helfen, was gebraucht wird. Mit dem Feature "ReadyToRun Images" (R2R) bringt das neue Werkzeug CrossGen parallel zum Intermediate Language Code auch den zugehörigen Maschinencode in das Kompilat ein. Die Anwendungsdateien werden dadurch größer, starten aber schneller. Ein vollständiger Ahead-of-Time-Compiler mit Tree Shaking soll dann im .NET-Core-Nachfolger mit Namen .NET 5.0 im November 2020 erscheinen.

Als weitere Deployment-Option können .NET-Core-Entwickler nun auch das neuere MSIX-Installationspaketformat verwenden, indem sie in Visual Studio 2019 ab Version 16.3 ein Windows Application Packaging Project für eine .NET-Core-Desktop- oder Konsolenanwendung erstellen. Per MSIX installierte Anwendungen können beim sich Anwendungsstart selbst von einer Webseite oder einem Netzlaufwerk aktualisieren. Damit ist MSIX ein Ersatz für das entfallene Click-Once-Deployment.

Mit der neuen Funktion "Major-version Roll Forward" können Entwickler oder Betreiber einer Anwendung nun steuern, dass eine ältere .NET-Core-Anwendung mit der neuesten .NET-Core-Laufzeitumgebung starten soll.

Für Entwickler bietet das .NET Core Software Development Kit (SDK) nun auch lokale Werkzeuge an, die nur für ein Verzeichnis auf der Festplatte und die Unterordner gelten. Das hat Microsoft aus dem Node Package Manager (NPM) abgeschaut.

Für Webentwickler gibt es in ASP.NET Core 3.0 eine erste Version des ersehnten "ASP.NET Blazor", mit denen sie Single Page Applications (SPA) in .NET mit Razor Components schreiben können. Die in ASP.NET Core 3.0 enthaltene Variante "Blazor Server App" alias "Server Side Blazor" läuft allerdings nicht auf Basis von WebAssembly im Browser, sondern – wie der Name auch ausdrückt – auf dem Webserver.

Dass Benutzer dennoch das Erlebnis einer SPA bekommen, liegt am Einsatz von ASP.NET Core SignalR, das die Benutzerinteraktionen mit der Webseite per Websocket zum Server sendet und die auf dem Server vorgenommenen Änderungen auf Document Object Model (DOM) zum Browser überträgt. Das dazu notwendige Shadow DOM auf dem Webserver für jeden angeschlossenen Browser schränkt allerdings die Skalierbarkeit ein und ist nicht Offline-fähig. Das Modell eignet sich für Webanwendungen mit kleineren Benutzerzahlen und bietet eine einfache Migrierbarkeit auf das Client-seitige Blazor, das mit WebAssembly im Browser läuft, für das es aber weiterhin keinen verkündeten Erscheinungstermin gibt.

Mit ASP.NET Core 3.0 setzt Microsoft nun um, was bereits für die Version 2.0 angedroht war: Das Webframework läuft nicht mehr auf dem klassischen .NET Framework, sondern nur noch auf .NET Core. Gleiches gilt nun überraschend auch für Entity Framework Core. Alle Kunden, die das klassische .NET Framework als Basis für ASP.NET Core oder Entity Framework Core genutzt haben, müssen nun auf .NET Core umsteigen oder sind von Weiterentwicklungen ausgeschlossen.

Die .NET-Familie 2019

(Bild: Holger Schwichtenberg)

Immerhin hat Microsoft angekündigt, den Support für ASP.NET Core 2.1 inklusive Entity Framework Core 2.1 auf .NET Framework abweichend von der Support-Richtlinie zu verlängern. Das sich dies auf Version 2.1 und nicht auf die Version 2.2 bezieht, liegt daran, dass erstere die Long-Term-Support-Version ist und Microsoft hier die zusätzlichen Kosten der längerfristigen Unterstützung einer weiteren Version einsparen will.

Als Ersatz für die in .NET Core auf der Serverseite nicht mehr angebotene Windows Communication Foundation (WCF) bietet Microsoft nun neben den seit der ersten Core-Version vorhandenen REST-basierten WebAPIs auch die Unterstützung für das auf HTTP/2 und Protocol Buffers aufsetzende Google RPC als Client und Server an.

Für die Erstellung von im Hintergrund laufenden Systemdiensten kann .NET Core 3.0 die Projektvorlage "Worker Service" und die Pakete Microsoft.Extensions.Hosting.WindowsServices für Windows und Microsoft.Extensions.Hosting.Systemd für Linux nutzen.

.NET Core 3.0 ist die erste .NET-Variante, die .NET Standard Version 2.1 implementiert. Zu den neuen Klassen in .NET Core 3.0 gehören neben den Basisklassen für einige Sprachfeatures (z.B. System.Index, System.Range, System.Span<T>, System.Memory<T>, System.ValueTask<T>) auch einige alte Tanten aus den Gründertagen von .NET wie die dynamische Codegenerierung mit Reflection Emit, die Abstraktion von Datenbankprovidern mit DbProviderFactories und sogar alte Visual Basic APIs, die auch in C# nutzbar sind.

Außerhalb des .NET Standard beherrscht .NET Core 3.0 nun auch die Interoperabilität mit COM- und WinRT-Komponenten (nur auf Windows), das Laden nur der Metadaten aus Assemblies (MetadataLoadContext) und das Entladen geladener Assemblies (AssemblyLoaderContext. Auch ein neue Bibliothek für JSON-Serialisierung und -Deserialisierung ist enthalten (System.Text.Json) und kommt in ASP.NET Core unter anderem bei Web APIs zum Einsatz, nachdem sich Microsoft mit James Newton-King, dem Autor des bisher verwendeten JSON.NET, nicht auf eine Umgestaltung einigen konnte.

Die Klasse System.Net.Http.HttpClient unterstützt nun HTTP/2. Unterstützung für TLS 1.3 gibt es auch in .NET Core 3.0, aber bisher nur auf Linux. Serielle Schnittstellen, die bisher nur unter Windows programmierbar waren, sind jetzt auch unter Linux nutzbar. In der Mathe-Bibliothek System.Math finden Entwickler neue Funktionen wie BitIncrement(Double), BitDecrement(Double), MaxMagnitude(Double, Double), MinMagnitude(Double, Double), ILogB(Double), ScaleB(Double, Int32) und CopySign(Double, Double).

Eine kleine, aber doch sehr hilfreiche Neuerung in .NET Core 3.0 ist, dass die APIs, die Aufschluss über die laufende .NET-Version (System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription und System.Environment.Version) geben, nun unter .NET Core die korrekte Versionsnummer 3.0 melden. In .NET Core 1.x und 2.x bekamen Aufrufer immer eine Versionsnummer zurück, die mit 4 begann und an das klassische .NET Framework angelehnt war. (ane)