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