.NET Core 3.0

Eintrag zuletzt aktualisiert am: 12.03.2020

.NET Core 3.0 ist am 23.9.2019 erschienen als Nachfolger von .NET Core 2.2. .NET Core 3.0 ist gemäß den Support-Richtlinien ein "Current"-Release und ersetzt .NET Core 2.2. Die nächste Version, .NET Core 3.1, wird ein "Long Termin Support"-Release (LTS) sein.

Erstankündigung auf der BUILD-Konferenz 2018 (Mai 2018)

Bisher konnte man mit .NET Core nur Web APIs, Webanwendungen und Konsolenanwendungen sowie Universal Windows Platform Apps erstellen. Entwickler klassischer Desktop-Anwendungen schauten in die Röhre. Microsoft hat auf der BUILD-Konferenz 2018 verkündet, dass Windows Presentation Foundation (WPF) und sogar die "alte Tante" Windows Forms im Rahmen von Version Core 3.0 auf .NET Core portiert werden. Sie laufen dann als Nuget-Pakete, allerdings nur auf Windows. Weder WPF noch Windows Forms werden durch diese Maßnahme plattformunabhängig. Dazu müsste Microsoft nicht nur den .NET-Teil beider Frameworks, sondern auch die Betriebssystemgrundlagentechniken GDI+ bzw. DirectX portieren. Zumindest GDI+ gibt es ja, denn es gibt in Mono ja auch Windows Forms.

Immerhin können mit WPF und Windows Forms auf .NET Core nur auf Windows aber Softwarehersteller, die nicht an Plattformneutralität interessiert sind, ihre bestehenden Windows-Anwendungen auf .NET Core auf Windows (ab Windows 7 bzw. Server 2008 R2 – auf älteren Windows-Versionen läuft .NET Core heute nicht!) betreiben und damit von den Vorteilen, die .NET Core im Bereich der Werkzeuge, der Geschwindigkeit und der Softwareinstallation bietet, profitieren.

Erscheinen auf der .NET Conf 2019 (23.9.2019)

Microsoft hat im Rahmen seiner Online-Veranstaltung ".NET Conf 2019" [https://www.dotnetconf.net] die dritte Hauptversion des modularen .NET Core und die achte Hauptversion seiner Programmiersprache C# freigegeben. Passend dazu ist die Version 16.3 von Visual Studio 2019 erschienen.

Nach einer längeren Preview-Phase mit neun Vorschauversionen zwischen Dezember 2018 und September 2019 können Softwareentwickler nun die Release-Version von .NET Core 3.0 kostenfrei herunterladen [https://dotnet.microsoft.com/download]. Dort enthalten ist der C#-Compiler Version 3.3, der C# 8.0 unterstützt.

Neuerungen der CLR

Auf der Ebene der CLR ist die bisher optionale Tiered Compilation (TC) im Just-In-Time-Compiler nun Standard in .NET Core 3.0. Der Just-In-Time-Compiler legt dabei zunächst den Fokus auf schnelle Übersetzung statt eines optimalem Ergebnisses. Erst später wird bei häufiger verwendeten Programmteilen die Übersetzung in Machinencode nachträglich optimiert.

Bei den Prozessoren neu ist die Unterstützung für ARM64-Prozessoren, allerdings zunächst nur mit Linux-Betriebssystemen. Mit Windows-Nutzer können vorerst keine .NET-Core-Anwendungen schreiben, die auf ARM64-Prozessoren laufen[https://github.com/dotnet/announcements/issues/82].

.NET Core für den Windows-Desktop

Nachdem die ersten beiden Versionen von .NET Core nur Webserver- und Konsolenanwendungen sowie die Windows 10 Universal Apps unterstützt haben, können Entwickler nun mit .NET Core 3.0 erstmals auch klassische Desktop-Anwendungen für der Windows Presentation Foundation (WPF) und Windows Forms erstellen. Allerdings verliert eine .NET Core-Anwendung durch den Einsatz der sogenannten ".NET Core Windows Desktop Runtime" ihre ansonsten weiterhin gegebene Plattformunabhängigkeit.

Einige Funktionen von WPF und Windows Forms stehen unter .NET Core noch nicht zur Verfügung. Dazu gehört die XAML Browser Application (XBAP) und der grafische Designer für Windows Forms sowie damit einhergehende die Designer-Klassen, mit denen Entwickler den Designer in eigene Anwendungen einbauen können. Microsoft arbeitet jedoch an dem Designer und diskutiert in einem YouTube-Video die Herausforderungen einer Migration des vor fast 20 Jahren entstandenen Designer-Codes auf das aktuelle .NET Core [https://www.youtube.com/watch?v=8xaeFyNlPYM]. Für WPF ist der auf .NET Core angepasste Designer in Visual Studio 2019 Version 16.3 enthalten.

Für Windows Forms gibt es in .NET Core 3.0 neue Funktionen zur Unterstützung hochauflösender Anzeigegeräte, die es im klassischen .NET Framework nicht gab (siehe Application.SetHighDpiMode() siehe [https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.application.sethighdpimode?view=netcore-3.0#SystemWindows_Forms_Application_SetHighDpiMode_System_Windows_Forms_HighDpiMode])

Entity Framework auf .NET Core

In Hinblick auf die Migration bestehender .NET Framework-Anwendungen auf .NET Core hat Microsoft auch die Variante seines Objekt-Relationalen Mappers Entity Framework auf .NET Core umgestellt. Die neue Version 6.3 [https://www.nuget.org/packages/EntityFramework/] bietet keine neuen Features außer der Lauffähigkeit auf .NET Core. Auch hier fehlt noch der grafische Designer.

Entwickler, die dennoch schon jetzt mit Windows Forms und Entity Framework in .NET Core starten wollen, können als Workaround vorerst die zugehörigen Designer in einem klassischen .NET-Projekte verwenden und das Resultat in ein .NET Core-Projekt verlinken.

Microsoft betont, dass man neue Projekte nicht mit Entity Framework, sondern nur mit Entity Framework Core [https://www.nuget.org/packages/Microsoft.EntityFrameworkCore] starten sollte. In der Version 3.0 hat Microsoft die Übersetzung von LINQ zu SQL komplett überarbeitet, sodass nun auch zum Beispiel auch Union-Operationen, Subqueries und komplexere Group By-Anweisungen in SQL übersetzt werden können. Die gefährliche automatische Client Evaluation, die hilfsweise alle Daten einer Tabelle zur Verarbeitung ins RAM holte, wurde abgeschafft. Neben einigen kleineren Verbesserungen beim Reverse Engineering gibt es ansonsten wenig Neuerungen in Version 3.0, sondern vorallem zahlreiche Breaking Changes [https://docs.microsoft.com/de-de/ef/core/what-is-new/ef-core-3.0/breaking-changes], die zum teil umfangreiche Änderungen an bestehendem Programmcode erfordern. Microsoft will das Produkt damit auf neue Features vorbereiten, die dann in der Zukunft erscheinen sollen.

Neue Verbreitungswege

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 Executables kann der Entwickler alle zu einer Anwendung notwendigen DLLs und weitere Dateien zu einer .EXE-Datei zur vereinfachten Weitergabe zusammenfassen. 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 Linkers aus Mono kann ein .NET Core-Entwickler immerhin DLLs im Deployment-Paket loswerden, die gar nicht gebraucht werden. Mit dem Feature "ReadyToRun Images" (R2R) kann er parallel zu dem Intermediate Language Code auch den zugehörigen Maschinencode in das Kompilat bringen. 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 [https://www.heise.de/developer/meldung/Build-2019-Microsoft-fuehrt-Mono-und-NET-Core-zusammen-zu-NET-5-0-4414166.html im November 2020 erscheinen.

Als weitere Deployment-Option können .NET Core-Entwickler nun auch das neuere MSIX-Installationspaketformat verwendet, indem Sie in Visual Studio 2019 ab Version 16.3 ein Windows Application Packaging Project für eine .NET-Core-Desktop oder Konsolenanwendung erstellen.

Für die die Funktion " Major-version Roll Forward" kann ein Entwickler oder ein Betreiber eine Anwendung nun steuern, dass eine ältere .NET-Core-Anwendung mit der neusten .NET Core-Laufzeitumgebung starten soll.

Für den 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. Dies hat Microsoft aus dem Node Package Manager abgeschaut.

Server Side Blazor

Für Webentwickler gibt es in ASP.NET Core 3.0 eine erste Version des ersehnten "ASP.NET Blazor" [http://www.dotnet-lexikon.de/ASPNETBlazor/lex/9293.aspx], mit denen man Single-Page-Web-Applications (SPA) in .NET mit Razor Components schreiben kann. Die in ASP.NET Core 3.0 enthaltene Variante "Server Side Blazor" läuft allerdings nicht auf Basis von Webassembly [http://www.dotnet-lexikon.de/Webassembly/lex/9030.aspx] im Browser, sondern – wie der Name auch ausdrückt – auf dem Webserver. Dass der Benutzer dennoch das Erlebnis einer SPA hat, liegt am Einsatz von ASP.NET Core SignalR [http://www.dotnet-lexikon.de/ASPNETSignalR/lex/6779.aspx], das die Benutzerinterkationen mit dem 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 schränkt natürlich die Skalierbarkeit ein und ist nicht Offline-fähig. Das Model eignet sich für Webanwendungen mit kleineren Benutzerzahlen und bietet eine einfache Migrierbarkeit auf das Client-seitigen Blazor, das mit Webassembly im Browser läuft, für das es aber weiterhin keinen verkündeten Erscheinungstermin gibt.

Neue Klassen

.NET Core 3.0 ist die erste .NET-Variante, die den .NET Standard Version 2.1 [https://devblogs.microsoft.com/dotnet/announcing-net-standard-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 der dynamischen Codegenerierung mit Reflection Emit und die Abstraktion von Datenbankprovidern mit DbProviderFactories.

Außerhalb des .NET Standards 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, siehe [https://github.com/dotnet/coreclr/blob/master/Documentation/design-docs/unloadability.md]. Auch ein neue Bibliothek für JSON-Serialisierung und -Deserialisierung ist enthalten (System.Text.Json, siehe [https://www.nuget.org/packages/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 [https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis]. 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 [https://docs.microsoft.com/de-de/dotnet/api/system.io.ports.serialport].
In der Mathe-Bibliothek System.Math findet der Entwickler neue Funktionen wie BitIncrement(Double), BitDecrement(Double), MaxMagnitude(Double, Double), MinMagnitude(Double, Double), ILogB(Double), ScaleB(Double, Int32) und CopySign(Double, Double).

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 WebAPIs auch die Unterstützung für das auf HTTP/2 und Protocol Buffers aufsetzende Google RPC [https://grpc.io] als Client und Server an.

Versionsanzeige-APIs

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) nun unter .NET Core die korrekte Versionsnummer 3.0 melden. In .NET Core 1.x und 2.x bekam der Aufrufer immer eine Versionsnummer zurück, die mit 4 begann und an das klassische .NET Framework angelehnt war.