Neuigkeiten in .NET Core 2.1What's new in .NET Core 2.1

.NET Core 2.1 enthält Verbesserungen und neue Features in folgenden Bereichen:.NET Core 2.1 includes enhancements and new features in the following areas:

ToolsTooling

Das .NET Core 2.1 SDK (Version 2.1.300), die in .NET Core 2.1 enthaltenen Tools, enthält die folgenden Änderungen und Verbesserungen:The .NET Core 2.1 SDK (v 2.1.300), the tooling included with .NET Core 2.1, includes the following changes and enhancements:

BuildleistungsverbesserungenBuild performance improvements

Ein wichtiger Schwerpunkt von .NET Core 2.1 ist die Verbesserung der Buildzeitleistung, insbesondere bei inkrementellen Builds.A major focus of .NET Core 2.1 is improving build-time performance, particularly for incremental builds. Diese Leistungsverbesserungen gelten sowohl für beide Befehlszeilenbuilds mit dotnet build als auch Builds in Visual Studio.These performance improvements apply to both command-line builds using dotnet build and to builds in Visual Studio. Einige individuelle Verbesserungsbereiche sind:Some individual areas of improvement include:

  • Bei der Auflösung von Paketressourcen werden statt aller Ressourcen nur die von einem Build verwendeten Ressourcen aufgelöst.For package asset resolution, resolving only assets used by a build rather than all assets.

  • Zwischenspeichern von Assemblyverweisen.Caching of assembly references.

  • Verwendung von SDK-Buildservern mit langer Ausführungszeit, wobei es sich um Prozesse handelt, die sich über einzelne dotnet build-Aufrufe erstrecken.Use of long-running SDK build servers, which are processes that span across individual dotnet build invocations. Sie machen die Notwendigkeit der JIT-Kompilierung großer Codeblöcke bei jeder Ausführung von dotnet build überflüssig.They eliminate the need to JIT-compile large blocks of code every time dotnet build is run. Buildserverprozesse können automatisch mithilfe des folgenden Befehls beendet werden:Build server processes can be automatically terminated with the following command:

    dotnet buildserver shutdown
    

Neue CLI-BefehleNew CLI commands

Eine Reihe von Tools, die nur auf Projektbasis unter Verwendung von DotnetCliToolReference verfügbar waren, steht jetzt als Teil des .NET Core SDK zur Verfügung.A number of tools that were available only on a per project basis using DotnetCliToolReference are now available as part of the .NET Core SDK. Zu diesen Tools gehören:These tools include:

  • dotnet watch bietet eine Dateisystemüberwachung, die vor der Ausführung eines designierten Satzes von Befehlen auf die Änderung einer Datei wartet.dotnet watch provides a file system watcher that waits for a file to change before executing a designated set of commands. Der folgende Befehl erstellt beispielsweise automatisch das aktuelle Projekt neu und generiert eine ausführliche Ausgabe, sobald sich eine Datei darin ändert:For example, the following command automatically rebuilds the current project and generates verbose output whenever a file in it changes:

    dotnet watch -- --verbose build
    

    Beachten Sie, dass die ---Option der --verbose-Option vorausgeht.Note the -- option that precedes the --verbose option. Sie begrenzt die Optionen, die dem dotnet watch-Befehl direkt von den Argumenten übergeben werden, die dem untergeordneten dotnet-Prozess übergeben werden.It delimits the options passed directly to the dotnet watch command from the arguments that are passed to the child dotnet process. Ohne sie gilt die --verbose-Option für den dotnet watch-Befehl, nicht den dotnet build-Befehl.Without it, the --verbose option applies to the dotnet watch command, not the dotnet build command.

    Weitere Informationen finden Sie unter Entwickeln von ASP.NET Core-Apps mit dotnet watch.For more information, see Develop ASP.NET Core apps using dotnet watch

  • dotnet dev-certs generiert und verwaltet Zertifikate, die während der Entwicklung in ASP.NET Core-Anwendungen verwendet werden.dotnet dev-certs generates and manages certificates used during development in ASP.NET Core applications.

  • dotnet user-secrets verwaltet die Geheimnisse in einem Benutzergeheimnisspeicher in ASP.NET Core-Anwendungen.dotnet user-secrets manages the secrets in a user secret store in ASP.NET Core applications.

  • dotnet sql-cache erstellt eine Tabelle und Indizes für Distributed Caching in einer Microsoft SQL Server-Datenbank.dotnet sql-cache creates a table and indexes in a Microsoft SQL Server database to be used for distributed caching.

  • dotnet ef ist ein Tool zum Verwalten von Datenbanken, DbContext-Objekten und Migrationen in Entity Framework Core-Anwendungen.dotnet ef is a tool for managing databases, DbContext objects, and migrations in Entity Framework Core applications. Weitere Informationen finden Sie unter EF Core .NET-Befehlszeilentools.For more information, see EF Core .NET Command-line Tools.

Globale ToolsGlobal Tools

.NET Core 2.1 unterstützt globale Tools – d.h. benutzerdefinierte Tools, die global über die Befehlszeile verfügbar sind..NET Core 2.1 supports Global Tools -- that is, custom tools that are available globally from the command line. Das Erweiterbarkeitsmodell in früheren Versionen von benutzerdefinierten .NET Core-Tools ist auf Projektbasis nur mithilfe von DotnetCliToolReference verfügbar.The extensibility model in previous versions of .NET Core made custom tools available on a per project basis only by using DotnetCliToolReference.

Verwenden Sie den dotnet tool install-Befehl, um ein globales Tool zu installieren.To install a Global Tool, you use the dotnet tool install command. Beispiel:For example:

dotnet tool install -g dotnetsay

Nach Abschluss der Installation kann das Tool durch Angeben seines Namens in der Befehlszeile ausgeführt werden.Once installed, the tool can be run from the command line by specifying the tool name. Weitere Informationen finden Sie unter Übersicht über globale .NET Core-Tools.For more information, see .NET Core Global Tools overview.

Toolverwaltung mit dem dotnet tool-BefehlTool management with the dotnet tool command

In .NET Core SDK 2.1 verwenden alle Toolsvorgänge den dotnet tool-Befehl.In .NET Core 2.1 SDK, all tools operations use the dotnet tool command. Die folgenden Optionen sind verfügbar:The following options are available:

RollforwardRoll forward

Ab .NET Core 2.0 wird für alle .NET Core-Anwendungen automatisch ein Rollforward auf die neueste Nebenversion auf einem System installiert.All .NET Core applications starting with .NET Core 2.0 automatically roll forward to the latest minor version installed on a system.

Wenn die Version von .NET Core, mit der eine Anwendung erstellt wurde, nicht zur Runtime vorhanden ist, wird die Anwendung ab .NET Core 2.0 automatisch für die neueste installierte Nebenversion von .NET Core ausgeführt.Starting with .NET Core 2.0, if the version of .NET Core that an application was built with is not present at runtime, the application automatically runs against the latest installed minor version of .NET Core. Das heißt, wenn eine Anwendung mit .NET Core 2.0 erstellt wurde, und .NET Core 2.0 auf dem Hostsystem nicht vorhanden ist, jedoch .NET Core 2.1, wird die Anwendung mit .NET Core 2.1 ausgeführt.In other words, if an application is built with .NET Core 2.0, and .NET Core 2.0 is not present on the host system but .NET Core 2.1 is, the application runs with .NET Core 2.1.

Wichtig

Dieses Rollforwardverhalten gilt nicht für Vorschauversionen.This roll-forward behavior doesn't apply to preview releases. Es wird standardmäßig auch nicht auf Hauptreleases angewendet. Dies können Sie mit den folgenden Einstellungen jedoch ändern.By default, it also doesn't apply to major releases, but this can be changed with the settings below.

Sie können dieses Verhalten anpassen, indem Sie die Einstellung für den Rollforward auf das freigegebene Framework ohne Candidate.You can modify this behavior by changing the setting for the roll-forward on no candidate shared framework. Folgende Einstellungen sind verfügbar:The available settings are:

  • 0: Das Rollforwardverhalten für Nebenversionen deaktivieren.0 - disable minor version roll-forward behavior. Mit dieser Einstellung wird für Anwendungen für .NET Core 2.0.0 ein Rollforward auf .NET Core 2.0.1 ausgeführt, aber nicht für .NET Core 2.2.0 oder .NET Core 3.0.0.With this setting, an application built for .NET Core 2.0.0 will roll forward to .NET Core 2.0.1, but not to .NET Core 2.2.0 or .NET Core 3.0.0.
  • 1: Das Rollforwardverhalten für Nebenversionen aktivieren.1 - enable minor version roll-forward behavior. Dies ist die Standardeinstellung.This is the default value for the setting. Mit dieser Einstellung wird für Anwendungen für .NET Core 2.0.0 ein Rollforward auf .NET Core 2.0.1 oder .NET Core 2.2.0 abhängig davon ausgeführt, was installiert wird. Es wird jedoch kein Rollforward auf .NET Core 3.0.0 ausgeführt.With this setting, an application built for .NET Core 2.0.0 will roll forward to either .NET Core 2.0.1 or .NET Core 2.2.0, depending on which one is installed, but it will not roll forward to .NET Core 3.0.0.
  • 2: Das Rollforwardverhalten für Neben- und Hauptversionen aktivieren.2 - enable minor and major version roll-forward behavior. Wenn diese Einstellung festgelegt wird, werden auch verschiedene Hauptversionen für das Rollforwardverhalten beachtet, d. h., für Anwendungen für .NET Core 2.0.0 wird ein Rollforward auf .NET Core 3.0.0 ausgeführt.If set, even different major versions are considered, so an application built for .NET Core 2.0.0 will roll forward to .NET Core 3.0.0.

Sie können diese Einstellung auf drei verschiedene Arten ändern:You can modify this setting in any of three ways:

  • Legen Sie den gewünschten Wert für die Umgebungsvariable DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX fest.Set the DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX environment variable to the desired value.

  • Fügen Sie die folgende Zeile mit dem gewünschten Wert in die runtimeconfig.json-Datei ein:Add the following line with the desired value to the runtimeconfig.json file:

    "rollForwardOnNoCandidateFx" : 0
    
  • Fügen Sie bei Verwendung der .NET Core-CLI-Tools die folgende Option mit dem gewünschten Wert zu einem .NET Core-Befehl wie run hinzu:When using .NET Core CLI tools, add the following option with the desired value to a .NET Core command such as run:

    dotnet run --rollForwardOnNoCandidateFx=0
    

Rollforwards für die Patchversionen sind unabhängig von dieser Einstellung und erfolgen erst, nachdem Rollforwards für Neben- und Hauptversionen ausgeführt wurden.Patch version roll forward is independent of this setting and is done after any potential minor or major version roll forward is applied.

BereitstellungDeployment

Wartung einer eigenständigen AnwendungSelf-contained application servicing

dotnet publish veröffentlicht jetzt eigenständige Anwendungen mit einer gewarteten Runtimeversion.dotnet publish now publishes self-contained applications with a serviced runtime version. Wenn Sie eine eigenständige Anwendung mit dem .NET Core 2.1 SDK (Version 2.1.300) veröffentlichen, enthält Ihre Anwendung die neueste gewartete Runtimeversion, die diesem SDK bekannt ist.When you publish a self-contained application with the .NET Core 2.1 SDK (v 2.1.300), your application includes the latest serviced runtime version known by that SDK. Wenn Sie auf das neueste SDK aktualisieren, veröffentlichen Sie mit der neuesten .NET Core-Runtimeversion.When you upgrade to the latest SDK, you’ll publish with the latest .NET Core runtime version. Dies gilt für Runtimes ab .NET Core 1.0.This applies for .NET Core 1.0 runtimes and later.

Eigenständige Veröffentlichung basiert auf Runtimeversionen auf „NuGet.org“. Die gewartete Runtime muss nicht auf Ihrem Computer vorhanden sein.Self-contained publishing relies on runtime versions on NuGet.org. You do not need to have the serviced runtime on your machine.

Bei Verwendung von .NET Core 2.0 SDK werden eigenständige Anwendungen mit der .NET Core 2.0.0-Runtime veröffentlicht, solange keine andere Version über die RuntimeFrameworkVersion-Eigenschaft angegeben wird.Using the .NET Core 2.0 SDK, self-contained applications are published with the .NET Core 2.0.0 runtime unless a different version is specified via the RuntimeFrameworkVersion property. Mit diesem neuen Verhalten müssen Sie diese Eigenschaft nicht mehr festlegen, um eine höhere Runtimeversion für eine eigenständige Anwendung auszuwählen.With this new behavior, you’ll no longer need to set this property to select a higher runtime version for a self-contained application. Der einfachste Ansatz, auf eine höhere Version zu aktualisieren, besteht darin, immer mit .NET Core 2.1 SDK (Version 2.1.300) zu veröffentlichen.The easiest approach going forward is to always publish with .NET Core 2.1 SDK (v 2.1.300).

Weitere Informationen finden Sie unter Rollforward der eigenständigen Runtimebereitstellung.For more information, see Self-contained deployment runtime roll forward.

Windows Compatibility PackWindows Compatibility Pack

Wenn Sie vorhandenen Code aus .NET Framework zu .NET Core portieren, können Sie das Windows Compatibility Pack verwenden.When you port existing code from the .NET Framework to .NET Core, you can use the Windows Compatibility Pack. Es bietet Zugriff auf 20.000 APIs mehr, als in .NET Core verfügbar sind.It provides access to 20,000 more APIs than are available in .NET Core. Zu diesen APIs zählen Typen in System.Drawing-Namespace, EventLog-Klasse, WMI, Leistungsindikatoren, Windows-Diensten sowie die Windows-Registrierungstypen und Member.These APIs include types in the System.Drawing namespace, the EventLog class, WMI, Performance Counters, Windows Services, and the Windows registry types and members.

Verbesserungen am JIT-CompilerJIT compiler improvements

.NET Core umfasst eine neue JIT-Compiler-Technologie namens mehrstufige Kompilierung (auch bekannt als adaptive Optimierung), die die Leistung erheblich verbessern kann..NET Core incorporates a new JIT compiler technology called tiered compilation (also known as adaptive optimization) that can significantly improve performance. Mehrstufige Kompilierung ist eine optionale Einstellung.Tiered compilation is an opt-in setting.

Eine der wichtigen Aufgaben, die vom JIT-Compiler ausgeführt werden, ist die Optimierung der Ausführung des Codes.One of the important tasks performed by the JIT compiler is optimizing code execution. Für wenig genutzte Codepfade muss der Compiler jedoch möglicherweise mehr Zeit zur Optimierung des Codes aufbringen, als die Runtime zur Ausführung nicht optimierten Codes benötigt.For little-used code paths, however, the compiler may spend more time optimizing code than the runtime spends running unoptimized code. Die mehrstufige Kompilierung unterteilt die JIT-Kompilierung in zwei Phasen:Tiered compilation introduces two stages in JIT compilation:

  • Eine erste Stufe, die so schnell wie möglich Code generiert.A first tier, which generates code as quickly as possible.

  • Eine zweite Stufe, die optimiertem Code für Methoden generiert, die häufig ausgeführt werden.A second tier, which generates optimized code for those methods that are executed frequently. Die zweite Stufe der Kompilierung wird parallel zum Verbessern der Leistung ausgeführt.The second tier of compilation is performed in parallel for enhanced performance.

Zum Aktivieren der mehrstufigen Kompilierung können Sie zwischen zwei Arten wählen.You can opt into tiered compilation in either of two ways.

  • Um mehrstufige Kompilierung in allen Projekten einzusetzen, die das .NET Core 2.1 SDK verwenden, legen Sie die folgende Umgebungsvariable fest:To use tiered compilation in all projects that use the .NET Core 2.1 SDK, set the following environment variable:

    COMPlus_TieredCompilation="1"
    
  • Um mehrstufige Kompilierung in ausgewählten Projekten einzusetzen, fügen Sie die <TieredCompilation>-Eigenschaft dem <PropertyGroup>-Abschnitt der MSBuild-Projektdatei hinzu, wie im folgenden Beispiel gezeigt:To use tiered compilation on a per-project basis, add the <TieredCompilation> property to the <PropertyGroup> section of the MSBuild project file, as the following example shows:

    <PropertyGroup>
        <!-- other property definitions -->
    
        <TieredCompilation>true</TieredCompilation>
    </PropertyGroup>
    

API-ÄnderungenAPI changes

Span<T> und Memory<T>Span<T> and Memory<T>

.NET Core 2.1 enthält einige neue Typen, die das Arbeiten mit Arrays und anderen Arten von Arbeitsspeicher wesentlich effizienter machen..NET Core 2.1 includes some new types that make working with arrays and other types of memory much more efficient. Die neuen Typen umfassen:The new types include:

Ohne diese Typen müssen Sie bei der Übergabe solcher Elemente als Teil eines Arrays oder Abschnitt eines Arbeitsspeicherpuffers eine Kopie eines Teils der Daten anfertigen, bevor Sie sie einer Methode übergeben.Without these types, when passing such items as a portion of an array or a section of a memory buffer, you have to make a copy of some portion of the data before passing it to a method. Diese Typen bieten eine virtuelle Sicht der Daten, die die zusätzliche Speicherzuweisung und Kopiervorgänge überflüssig macht.These types provide a virtual view of that data that eliminates the need for the additional memory allocation and copy operations.

Das folgende Beispiel verwendet eine Span<T>- und eine Memory<T>-Instanz, um eine virtuelle Ansicht von 10 Elementen eines Arrays bereitzustellen.The following example uses a Span<T> and Memory<T> instance to provide a virtual view of 10 elements of an array.

using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[100];
        for (int i = 0; i < 100; i++)
        {
            numbers[i] = i * 2;
        }

        var part = new Span<int>(numbers, start: 10, length: 10);
        foreach (var value in part)
            Console.Write($"{value}  ");
    }
}
// The example displays the following output:
//     20  22  24  26  28  30  32  34  36  38
Module Program
    Sub Main()
        Dim numbers As Integer() = New Integer(99) {}

        For i As Integer = 0 To 99
            numbers(i) = i * 2
        Next

        Dim part = New Memory(Of Integer)(numbers, start:=10, length:=10)

        For Each value In part.Span
            Console.Write($"{value}  ")
        Next
    End Sub
End Module
' The example displays the following output:
'     20  22  24  26  28  30  32  34  36  38

Brotli-KomprimierungBrotli compression

Ab .NET Core 2.1 werden Brotli-Komprimierung und -Dekomprimierung unterstützt..NET Core 2.1 adds support for Brotli compression and decompression. Brotli ist ein allgemein einsetzbarer verlustfreier Komprimierungsalgorithmus, der in RFC 7932 definiert ist und von den meisten Webbrowsern und den wichtigsten Webservern unterstützt wird.Brotli is a general-purpose lossless compression algorithm that is defined in RFC 7932 and is supported by most web browsers and major web servers. Sie können die streambasierte System.IO.Compression.BrotliStream-Klasse oder die leistungsstarken, bereichsbasierten Klassen System.IO.Compression.BrotliEncoder und System.IO.Compression.BrotliDecoder verwenden.You can use the stream-based System.IO.Compression.BrotliStream class or the high-performance span-based System.IO.Compression.BrotliEncoder and System.IO.Compression.BrotliDecoder classes. Im folgenden Beispiel wird die Komprimierung mit der BrotliStream-Klasse veranschaulicht:The following example illustrates compression with the BrotliStream class:

public static Stream DecompressWithBrotli(Stream toDecompress)   
{
    MemoryStream decompressedStream = new MemoryStream();
    using (BrotliStream decompressionStream = new BrotliStream(toDecompress, CompressionMode.Decompress))
    {
        decompressionStream.CopyTo(decompressedStream);
    }
    decompressedStream.Position = 0;
    return decompressedStream;
}

Das BrotliStream-Verhalten entspricht dem von DeflateStream und GZipStream. Dies vereinfacht das Konvertieren von Code, der diese APIs nach BrotliStream aufruft.The BrotliStream behavior is the same as DeflateStream and GZipStream, which makes it easy to convert code that calls these APIs to BrotliStream.

Neue Kryptografie-APIs und KryptografieverbesserungenNew cryptography APIs and cryptography improvements

.NET Core 2.1 enthält zahlreiche Verbesserungen der Kryptografie-APIs:.NET Core 2.1 includes numerous enhancements to the cryptography APIs:

SocketverbesserungenSockets improvements

.NET Core umfasst einen neuen Typ, System.Net.Http.SocketsHttpHandler, und einen umgeschriebenen, System.Net.Http.HttpMessageHandler, die gemeinsam die Basis der Netzwerk-APIs auf höherer Ebene bilden..NET Core includes a new type, System.Net.Http.SocketsHttpHandler, and a rewritten System.Net.Http.HttpMessageHandler, that form the basis of higher-level networking APIs. System.Net.Http.SocketsHttpHandler ist z.B. die Grundlage der HttpClient-Implementierung.System.Net.Http.SocketsHttpHandler, for example, is the basis of the HttpClient implementation. In früheren Versionen von .NET Core basierten APIs auf höherer Ebene auf nativen Netzwerkimplementierungen.In previous versions of .NET Core, higher-level APIs were based on native networking implementations.

Die in .NET Core 2.1 eingeführte Socketimplementierung hat eine Reihe von Vorteilen:The sockets implementation introduced in .NET Core 2.1 has a number of advantages:

  • Eine beträchtliche Leistungssteigerung im Vergleich zur früheren Implementierung.A significant performance improvement when compared with the previous implementation.

  • Plattformabhängigkeiten wurden eliminiert, was Bereitstellung und Wartung vereinfacht.Elimination of platform dependencies, which simplifies deployment and servicing.

  • Einheitliches Verhalten auf allen .NET Core-Plattformen.Consistent behavior across all .NET Core platforms.

SocketsHttpHandler ist die Standardimplementierung in .NET Core 2.1.SocketsHttpHandler is the default implementation in .NET Core 2.1. Allerdings können Sie Ihre Anwendung mit der älteren HttpClientHandler-Klasse durch Aufrufen der AppContext.SetSwitch-Methode konfigurieren:However, you can configure your application to use the older HttpClientHandler class by calling the AppContext.SetSwitch method:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", False)

Statt auf SocketsHttpHandler basierender Socketimplementierungen können Sie auch eine Umgebungsvariable verwenden.You can also use an environment variable to opt out of using sockets implementations based on SocketsHttpHandler. Legen Sie dazu für DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER entweder false oder 0 (null) fest.To do this, set the DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER to either false or 0.

Unter Windows können Sie auch System.Net.Http.WinHttpHandler verwenden, was von einer nativen Implementierung abhängt, oder die SocketsHttpHandler-Klasse durch Übergabe einer Instanz der Klasse an den HttpClient-Konstruktor.On Windows, you can also choose to use System.Net.Http.WinHttpHandler, which relies on a native implementation, or the SocketsHttpHandler class by passing an instance of the class to the HttpClient constructor.

Auf Linux und macOS können Sie HttpClient nur pro Prozess konfigurieren.On Linux and macOS, you can only configure HttpClient on a per-process basis. Unter Linux müssen Sie libcurl bereitstellen, wenn Sie die alte HttpClient-Implementierung verwenden möchten.On Linux, you need to deploy libcurl if you want to use the old HttpClient implementation. (Wird mit .NET Core 2.0 installiert.)(It is installed with .NET Core 2.0.)

Siehe auchSee also