/.NET Core 2.0 und die zugehörige Produktfamilie sind fertig

.NET Core 2.0 und die zugehörige Produktfamilie sind fertig

Microsoft hat die zweite Hauptversion seiner Core-Produktfamilie mit .NET Core, ASP.NET Core und Entity Framework Core bereitgestellt. Parallel ist das dritte Update zu Visual Studio erschienen, das die Core-2.0-Produkte unterstützt.

Die fertige Version 2.0 von .NET Core, ASP.NET Core und Entity Framework Core kommt nun doch etwas eher als die Ankündigung auf Microsofts Techwiese am 9. August 2017 nahelegte. Per Blogeintrag hat Microsoft heute bekanntgegeben, dass die 2.0-RTM-Versionen ab sofort zur Verfügung steht.

Die größte Neuerung in .NET Core 2.0 ist die Implementierung der Spezifikation “.NET Standard 2.0”, die Microsoft erst letzte Woche fertiggestellt hatte. Gegenüber .NET Core 1.1 realisiert .NET Core 2.0 damit rund 19 000 zusätzliche Programmierschnittstellen aus dem ursprünglichen .NET Framework. Damit wird nicht nur die Migration bestehenden Programmcodes auf .NET Core deutlich einfacher, sondern es laufen auch sehr viel mehr bestehende .NET-Softwarekomponenten unter .NET Core, die für das klassische .NET Framework geschrieben wurden. Laut Microsoft-Programmmanager für .NET Immo Landwerth sind nun 70 % der auf Nuget.org verfügbaren Pakete unter .NET Core 2.0 lauffähig, zumal .NET Core nun auch direkt .NET Framework-Pakete referenzieren kann. Auch totgesagte Klassen wie System.Data.DataSet finden sich damit in der Welt von .NET Core ein.

Immo Landwerth zu .NET Core

.NET Core verwendet den neueren, berühmt und aufgrund seines schweren Bugs in der ersten Version berüchtigten Just-in-Time-Compiler RyuJIT nun auch in der 32-bit-Version anstelle des alten JIT32. RyuJIT wurde für 64-Bit-Systeme in .NET Framework 4.6 eingeführt und auch in .NET Core 1.x im 64-Bit-Modus verwendet. Jetzt in .NET Core 2.0 kommt RyuJIT in einer beschleunigten Version für 32- und 64-Bit-Anwendungen zum Einsatz.

Die Downloads zu .NET Core 2.0 (Runtime und SDKs für zahlreiche Betriebssysteme) gibt es auf GitHub und der offiziellen Microsoft-.NET-Core-Seite. Auch Docker-Images auf Basis von Linux und Windows Nano Server sind verfügbar. Außer auf den bisher unterstützen Windows-, Linux- und MacOS-Varianten läuft .NET Core nun auch auf Fedora 25/26, Debian 9, Ubuntu 17.04, Linux Mint 18, Suse Enterprise Linux 12 SP2+ und MacOS 10.13 “High Sierra”. Die Unterstützung für ARM32-Prozessoren bleibt vorerst im Preview-Stadium.

.NET Core 2.0 kann neben .NET Core 1.x auf einem System existieren. Zu beachten ist aber, dass nach der Installation des .NET Core 2.0 SDK (siehe Abbildung 1) dessen Werkzeuge auch für die .NET-Core-1.x-Projekte automatisch zum Einsatz kommen, sofern Entwickler nicht durch einen Eintrag in der global.json-Datei des jeweiligen Dateisystemordners das explizite Verwenden des älteren SDK erzwingen. Neben C# und F# kann Microsoft nun für die .NET-Core-Entwicklung auch mit Visual Basic .NET umgehen. Projektvorlagen dafür liefert Microsoft aber zunächst nur für Konsolenanwendungen und Bibliotheken, bisher nicht für Webprojekte.

Entwickler, die bisher .NET Core 1.0 oder 1.1 einsetzen, müssen beachten, dass der Support noch maximal bis zum 27. Juni 2019 läuft. Er kann sogar früher enden, wenn Microsoft .NET Core 2.0 zur Long-Term-Support-Version (LTS) erklärt. Das ist noch nicht erfolgt. Ab dieser Statuserklärung haben Nutzer von .NET Core 1.x nur noch ein Jahr Zeit für den Umstieg auf Version 2.0.



Installation des .NET Core 2.0 SDK (Abb. 1)

Für die Entwicklung mit .NET Core 2.0 ist das parallel veröffentlichte Visual Studio 2017 Update 3 (siehe Abbildung 2) notwendig. Es ist die erste Version von Visual Studio, die den Parallelbetrieb mehrerer verschiedener .NET Core SDKs, .NET Core in Windows-Nano-Server-basierten Docker-Containern (bisher legte Visual Studio immer nur Linux-Container an) sowie das Live-Unit-Testing von .NET-Core-Anwendungen unterstützt. Weiterhin brauchen Entwickler für das Live-Unit-Testing die teure Enterprise-Version von Visual Studio. .NET Core 2.0 lässt sich auch mit Visual Studio for Mac in der frisch erschienen Version 7.1 benutzen.



Das Visual Studio-Set-up bietet ab sofort Update 3 an (Abb. 2).

Auch für das Webentwicklungsframework ASP.NET Core hat Microsoft die Version 2.0 fertiggestellt. Anders als beim Erscheinen der ersten Preview-Version angekündigt läuft ASP.NET Core 2.0 nun doch nicht nur auf .NET Core 2.0, sondern weiterhin auch auf dem klassischen .NET Framework (ab Version 4.6.1). ASP.NET Core 2.0 basiert auf .NET Standard 2.0 und läuft daher nicht auf älteren .NET-Framework-Versionen.

Ab ASP.NET Core 2.0 bietet Microsoft mit Microsoft.AspNetCore ein Nuget-Paket an, das als Meta-Paket alle von Microsoft für ASP.NET Core erstellten Nuget-Pakete nach sich zieht – einschließlich Entity Framework Core 2.0. Auf den ersten Blick widerspricht das der von Microsoft mit .NET Core propagierten Strategie der minimalen Referenzierung von .NET-Klassen. Auf den zweiten Blick sorgen die Deployment-Tools von .NET Core dafür, dass am Ende nur die tatsächlich benötigten Pakete übrigbleiben. Microsoft dokumentiert den Umstellungsprozess von ASP.NET Core 1.x-Anwendungen auf Version 2.0.

ASP.NET Core bietet neben Performanceverbesserungen nun auch eine Unterstützung für die C#-7.1-Syntax in Views sowie als “Razor Pages” bezeichnete Views, die ganz ohne Controller auskommen. ASP.NET Core 2.0 Views lassen sich nun vorkompilieren – Microsoft hatte das in den Beta-Varianten für Version 1.0 bereits integriert, dann aber wieder ausgebaut. Den Start-up-Programmcode von ASP.NET hat das Unternehmen in Version 2.0 mit Einführung der Methode WebHost.CreateDefaultBuilder() stark vereinfacht.

Visual Studio 2017 bietet neuerdings beim Anlegen neuer ASP.NET-Core-Webprojekte eine Auswahl zwischen .NET Core 1.0, 1.1 und 2.0 sowie neue Projektvorlagen, die neben Server-Programmcode auch direkt Client-Code mit Angular (derzeit auf Stand 4.1.2) oder React (derzeit Version 15.5.0) enthalten (siehe Abbildung 3). Die neuen Vorlagen sind auch über das Kommandozeilenwerkzeug dotnet new verfügbar.



Mehr Auswahl beim Anlegen neuer ASP.NET Core-Webprojekte in Visual Studio 2017 Update 3 (Abb. 3)

Folgender Quelltextauszug zeigt ein Beispiel für eine Razor-Seite mit eingestreutem C#-Code in ASP.NET Core 2.0:

@page
@functions {
public string FormatDate(DateTime theTime) {
return theTime.ToString("d");
}
}
<html>
<body>
<h2>Uhrzeit auf dem Server:</h2>
<p>@FormatDate(DateTime.Now)</p>
</body>
</html>

Entity Framework Core gibt es auch in der Version 2.0 in mehreren Nuget-Paketen, für die Datenbankmanagementsysteme Microsoft SQL Server, Microsoft SQL Server Compact 3.5 und Microsoft SQL Server Compact 4.0, SQLite sowie das In-Memory-Treiber für Unit Testing. Die Aktualisierung der Treiber weiterer Hersteller wird folgen. Die für Version 1.x veröffentlichten Treiber sind nicht kompatibel zu Version 2.0, weil Microsoft wie schon während der Beta-Phase von 1.x abermals die Programmierschnittstelle geändert hat.

Entity Framework Core 2.0 basiert nun auf .NET Standard 2.0 und kann auf allen Plattformen laufen, die diesen API-Standard unterstützen, also .NET Framework ab Version 4.6.1, .NET Core ab Version 2.0, Xamarin.iOS ab Version 10.14, Xamarin.Android ab Version 7.5 und Xamarin.Mac ab Version 3.8. Dazu gehört aber aktuell noch nicht die Universal Windows Platform (UWP) in Windows 10. Hier kommt erst im Herbst mit dem Windows 10 Fall Creators Update die Unterstützung für .NET Standard in Version 2.0.

Entity Framework Core 2.0 erhält einige neue Features wie globale Datenfilter, die in der Kontextklasse definierbar sind und auf alle Abfragen einschließlich Eager-Loading-Befehlen wirken. Damit lassen sich Mandantenfähigkeit und besondere Anforderungen wie ein Soft Delete (Markieren eines Datensatz als gelöscht, statt ihn wirklich zu löschen) realisieren. Instanzen des Entity-Framework-Kontextes lassen sich nun mit AddDbContextPool<T>() vorab erzeugen und in einem Pool verwalten, sodass Webanwendungen bei eingehenden HTTP-Anfragen schneller darauf zugreifen können. Bei der Verwendung von SQL für Abfragen können Entwickler nun die in C# 6.0 eingeführte String-Interpolations-Syntax zum Zusammenbau des SQL-Befehls verwenden. Entity Framework Core sorgt dabei dafür, dass es sich nicht für SQL-Injektionsangriffe verwenden lässt, wie folgender Code zur String-Interpolation bei SQL-Befehlen in Entity Framework Core 2.0 zeigt:

string ort = "Berlin";
using (var ctx = new WWWingsContext())
{
ctx.Log();
IQueryable<Flug> flugliste =
ctx.FlugSet.FromSql($@"Select * from Flug where Abflugort={ort}");
Console.WriteLine(flugliste.Count());
foreach (var flug in flugliste)
{
Console.WriteLine(flug);
}
}

Microsoft hat in einigen Situationen die Übersetzung von LINQ zu SQL verbessert und führt nun einige Befehle in der Datenbank statt im RAM aus (vgl. Release Notes zu Entity Framework Core 2.0). In einem ersten Test hat Entity Framework Core 2.0 im Gegensatz zur 1.1-Version nun tatsächlich Abfragen mit ToString().Contains() und AddDays() korrekt in SQL übersetzt. Leider gilt das nicht für den wichtigen Operator GroupBy, der weiterhin alle Datensätze ins RAM lädt, um sie dort zu gruppieren, was in der Praxis häufig nicht akzeptabel ist. Benutzer auf GitHub reagieren darauf mit großem Unverständnis. Silveria Miranda kommentiert: “Two years and almost two versions later this basic function has not yet been implemented nor is it in the priorities. The EntityFramework Core should still be in beta and not going to version 2.0”.

Microsoft selbst hatte die Übersetzung von GroupBy in der Roadmap für Entity Framework Core als “kritisches Feature, das fehlt” bezeichnet. Ein Blick in die Roadmap offenbart, dass Microsoft aber auch zahlreiche andere Funktionen aus dieser Liste nicht in Entity Framework Core 2.0 umgesetzt hat, was verwundern kann, da andere, nebensächliche Funktionen realisiert wurden.


(rme)