Co nowego w programie .NET Core 2.1
Platforma .NET Core 2.1 zawiera ulepszenia i nowe funkcje w następujących obszarach:
- Narzędzi
- Przerzuć do przodu
- Wdrożenie
- Pakiet zgodności systemu Windows
- Ulepszenia kompilacji JIT
- Zmiany interfejsu API
Narzędzia
Zestaw .NET Core 2.1 SDK (wersja 2.1.300), narzędzia dołączone do platformy .NET Core 2.1 zawierają następujące zmiany i ulepszenia:
Ulepszenia wydajności kompilacji
Głównym celem platformy .NET Core 2.1 jest poprawa wydajności czasu kompilacji, szczególnie w przypadku kompilacji przyrostowych. Te ulepszenia wydajności dotyczą zarówno kompilacji wiersza polecenia, jak i dotnet build
kompilacji w programie Visual Studio. Niektóre obszary poprawy obejmują:
W przypadku rozpoznawania zasobów pakietu rozpoznawanie tylko zasobów używanych przez kompilację, a nie wszystkie zasoby.
Buforowanie odwołań do zestawów.
Korzystanie z długotrwałych serwerów kompilacji zestawu SDK, które są procesami obejmującymi poszczególne
dotnet build
wywołania. Eliminują potrzebę kompilowania dużych bloków kodu JIT za każdym razem, gdydotnet build
jest uruchamiany. Procesy serwera kompilacji można automatycznie zakończyć za pomocą następującego polecenia:dotnet buildserver shutdown
Nowe polecenia interfejsu wiersza polecenia
Wiele narzędzi, które były dostępne tylko dla poszczególnych projektów przy użyciu DotnetCliToolReference
, są teraz dostępne jako część zestawu .NET Core SDK. Do tych narzędzi należą:
dotnet watch
Udostępnia obserwatora systemu plików, który czeka na zmianę pliku przed wykonaniem wyznaczonego zestawu poleceń. Na przykład następujące polecenie automatycznie ponownie kompiluje bieżący projekt i generuje pełne dane wyjściowe za każdym razem, gdy w nim zmieni się plik:dotnet watch -- --verbose build
Zwróć uwagę na
--
opcję poprzedzającą--verbose
tę opcję. Rozdziela opcje przekazywane bezpośrednio dodotnet watch
polecenia z argumentów przekazywanych do procesu podrzędnegodotnet
. Bez niego--verbose
opcja ma zastosowanie dodotnet watch
polecenia, a niedotnet build
polecenia.Aby uzyskać więcej informacji, zobacz Develop ASP.NET Core apps using dotnet watch (Tworzenie aplikacji platformy ASP.NET Core przy użyciu funkcji dotnet watch).
dotnet dev-certs
generuje certyfikaty używane podczas programowania w aplikacjach ASP.NET Core i zarządza nimi.dotnet user-secrets
zarządza wpisami tajnymi w magazynie wpisów tajnych użytkownika w aplikacjach ASP.NET Core.dotnet sql-cache
Tworzy tabelę i indeksy w bazie danych programu Microsoft SQL Server, która ma być używana do buforowania rozproszonego.dotnet ef
to narzędzie do zarządzania bazami danych, DbContext obiektami i migracjami w aplikacjach Platformy Entity Framework Core. Aby uzyskać więcej informacji, zobacz Narzędzia wiersza polecenia platformy .NET platformy EF Core.
Narzędzia globalne
Platforma .NET Core 2.1 obsługuje narzędzia globalne — czyli niestandardowe narzędzia dostępne globalnie w wierszu polecenia. Model rozszerzalności w poprzednich wersjach platformy .NET Core udostępniał niestandardowe narzędzia dla poszczególnych projektów tylko przy użyciu polecenia DotnetCliToolReference
.
Aby zainstalować narzędzie globalne, należy użyć polecenia dotnet tool install . Na przykład:
dotnet tool install -g dotnetsay
Po zainstalowaniu narzędzie można uruchomić z poziomu wiersza polecenia, określając nazwę narzędzia. Aby uzyskać więcej informacji, zobacz Omówienie narzędzi globalnych platformy .NET Core.
Zarządzanie narzędziami za dotnet tool
pomocą polecenia
W zestawie SDK platformy .NET Core 2.1 wszystkie operacje narzędzi używają dotnet tool
polecenia . Dostępne są następujące opcje:
dotnet tool install
aby zainstalować narzędzie.dotnet tool update
aby odinstalować i ponownie zainstalować narzędzie, które skutecznie go aktualizuje.dotnet tool list
aby wyświetlić listę aktualnie zainstalowanych narzędzi.dotnet tool uninstall
aby odinstalować aktualnie zainstalowane narzędzia.
Przerzuć do przodu
Wszystkie aplikacje platformy .NET Core, począwszy od platformy .NET Core 2.0, są automatycznie przenoszone do najnowszej wersji pomocniczej zainstalowanej w systemie.
Począwszy od platformy .NET Core 2.0, jeśli wersja platformy .NET Core, z którą utworzono aplikację, nie jest obecna w czasie wykonywania, aplikacja jest uruchamiana automatycznie w najnowszej zainstalowanej wersji pomocniczej platformy .NET Core. Innymi słowy, jeśli aplikacja została skompilowana przy użyciu platformy .NET Core 2.0, a platforma .NET Core 2.0 nie jest obecna w systemie hosta, ale jest to .NET Core 2.1, aplikacja działa z platformą .NET Core 2.1.
Ważne
To zachowanie przesyłania zbiorczego nie ma zastosowania do wersji zapoznawczych. Domyślnie nie dotyczy to również głównych wersji, ale można to zmienić przy użyciu poniższych ustawień.
To zachowanie można zmodyfikować, zmieniając ustawienie dla opcji roll-forward bez platformy udostępnionej kandydata. Dostępne ustawienia to:
0
— wyłącz zachowanie wycofywania wersji pomocniczej. Dzięki temu ustawieniu aplikacja utworzona dla platformy .NET Core 2.0.0 będzie przekazywać do platformy .NET Core 2.0.1, ale nie do platformy .NET Core 2.2.0 lub .NET Core 3.0.0.1
— włącz zachowanie wycofywania wersji pomocniczej. Jest to wartość domyślna ustawienia. Dzięki temu ustawieniu aplikacja utworzona dla platformy .NET Core 2.0.0 będzie przekazywać do platformy .NET Core 2.0.1 lub .NET Core 2.2.0, w zależności od tego, która z nich jest zainstalowana, ale nie będzie przekazywać do platformy .NET Core 3.0.0.2
— włącz zachowanie wycofywania wersji pomocniczej i głównej. W przypadku ustawienia są brane pod uwagę nawet różne wersje główne, więc aplikacja utworzona dla platformy .NET Core 2.0.0 będzie przekazywać do platformy .NET Core 3.0.0.
To ustawienie można zmodyfikować na dowolny z trzech sposobów:
Ustaw zmienną
DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX
środowiskową na żądaną wartość.Dodaj następujący wiersz z żądaną wartością do pliku .runtimeconfig.json :
"rollForwardOnNoCandidateFx" : 0
W przypadku korzystania z interfejsu wiersza polecenia platformy .NET dodaj następującą opcję z żądaną wartością do polecenia platformy .NET, takiego jak
run
:dotnet run --rollForwardOnNoCandidateFx=0
Wprowadzanie wersji poprawek jest niezależne od tego ustawienia i jest wykonywane po zastosowaniu potencjalnej wersji pomocniczej lub głównej.
Wdrożenie
Samodzielna obsługa aplikacji
dotnet publish
teraz publikuje aplikacje samodzielne z wersją środowiska uruchomieniowego usługi. Podczas publikowania aplikacji samodzielnej przy użyciu zestawu .NET Core 2.1 SDK (wersja 2.1.300) aplikacja zawiera najnowszą wersję środowiska uruchomieniowego usługi znaną przez ten zestaw SDK. Po uaktualnieniu do najnowszego zestawu SDK opublikujesz najnowszą wersję środowiska uruchomieniowego platformy .NET Core. Dotyczy to środowisk uruchomieniowych .NET Core 1.0 i nowszych.
Samodzielne publikowanie opiera się na wersjach środowiska uruchomieniowego w NuGet.org. Nie musisz mieć środowiska uruchomieniowego usługi na maszynie.
Korzystając z zestawu .NET Core 2.0 SDK, aplikacje samodzielne są publikowane przy użyciu środowiska uruchomieniowego platformy .NET Core 2.0.0, chyba że za pośrednictwem RuntimeFrameworkVersion
właściwości określono inną wersję. Dzięki temu nowemu zachowaniu nie trzeba już ustawiać tej właściwości, aby wybrać wyższą wersję środowiska uruchomieniowego dla aplikacji samodzielnej. Najprostszym podejściem w przyszłości jest zawsze publikowanie przy użyciu zestawu .NET Core 2.1 SDK (wersja 2.1.300).
Aby uzyskać więcej informacji, zobacz Samodzielne wdrażanie środowiska uruchomieniowego wdrażania.
Pakiet zgodności systemu Windows
W przypadku przenoszenia istniejącego kodu z programu .NET Framework do platformy .NET Core można użyć pakietu zgodności systemu Windows. Zapewnia dostęp do 20 000 więcej interfejsów API niż są dostępne na platformie .NET Core. Te interfejsy API obejmują typy w System.Drawing przestrzeni nazw, klasę, EventLog usługę WMI, liczniki wydajności, usługi systemu Windows oraz typy rejestru i składowe systemu Windows.
Ulepszenia kompilatora JIT
Platforma .NET Core zawiera nową technologię kompilatora JIT o nazwie kompilacja warstwowa (nazywana również optymalizacją adaptacyjną), która może znacznie poprawić wydajność. Kompilacja warstwowa to ustawienie zgody.
Jednym z ważnych zadań wykonywanych przez kompilator JIT jest optymalizacja wykonywania kodu. Jednak w przypadku mało używanych ścieżek kodu kompilator może poświęcić więcej czasu na optymalizację kodu niż środowisko uruchomieniowe spędza czas na uruchamianiu niezoptymalizowanego kodu. Kompilacja warstwowa wprowadza dwa etapy kompilacji JIT:
Pierwsza warstwa, która generuje kod tak szybko, jak to możliwe.
Druga warstwa, która generuje zoptymalizowany kod dla tych metod, które są często wykonywane. Druga warstwa kompilacji jest wykonywana równolegle w celu zwiększenia wydajności.
Możesz wyrazić zgodę na kompilację warstwową na jeden z dwóch sposobów.
Aby użyć kompilacji warstwowej we wszystkich projektach korzystających z zestawu .NET Core 2.1 SDK, ustaw następującą zmienną środowiskową:
COMPlus_TieredCompilation="1"
Aby użyć kompilacji warstwowej dla poszczególnych projektów, dodaj
<TieredCompilation>
właściwość do<PropertyGroup>
sekcji pliku projektu MSBuild, jak pokazano w poniższym przykładzie:<PropertyGroup> <!-- other property definitions --> <TieredCompilation>true</TieredCompilation> </PropertyGroup>
Zmiany w interfejsie API
Span<T>
i Memory<T>
Platforma .NET Core 2.1 zawiera niektóre nowe typy, które znacznie wydajniej współpracują z tablicami i innymi typami pamięci. Nowe typy obejmują:
Bez tych typów podczas przekazywania takich elementów jak część tablicy lub sekcji buforu pamięci należy utworzyć kopię niektórych części danych przed przekazaniem jej do metody. Te typy zapewniają wirtualny widok tych danych, który eliminuje konieczność dodatkowej alokacji pamięci i operacji kopiowania.
W poniższym przykładzie użyto Span<T> klasy i Memory<T> , aby udostępnić wirtualny widok 10 elementów tablicy.
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
Kompresja Brotli
Platforma .NET Core 2.1 dodaje obsługę kompresji Brotli i dekompresji. Brotli to algorytm kompresji bezstratnej ogólnego przeznaczenia, który jest zdefiniowany w dokumencie RFC 7932 i jest obsługiwany przez większość przeglądarek internetowych i głównych serwerów internetowych. Można użyć klasy opartej na System.IO.Compression.BrotliStream strumieniu lub klas opartych na System.IO.Compression.BrotliEncoder wysokiej wydajności i System.IO.Compression.BrotliDecoder klas. Poniższy przykład ilustruje kompresję z klasą BrotliStream :
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;
}
Public Function DecompressWithBrotli(toDecompress As Stream) As Stream
Dim decompressedStream As New MemoryStream()
Using decompressionStream As New BrotliStream(toDecompress, CompressionMode.Decompress)
decompressionStream.CopyTo(decompressedStream)
End Using
decompressedStream.Position = 0
Return decompressedStream
End Function
Zachowanie BrotliStream jest takie samo jak DeflateStream i GZipStream, co ułatwia konwertowanie kodu wywołującego te interfejsy API na BrotliStream.
Nowe interfejsy API kryptografii i ulepszenia kryptografii
Platforma .NET Core 2.1 zawiera liczne ulepszenia interfejsów API kryptografii:
System.Security.Cryptography.Pkcs.SignedCms Jest dostępny w pakiecie System.Security.Cryptography.Pkcs. Implementacja jest taka sama jak SignedCms klasa w programie .NET Framework.
Nowe przeciążenia X509Certificate.GetCertHash metod i X509Certificate.GetCertHashString akceptują identyfikator algorytmu wyznaczania wartości skrótu, aby umożliwić obiektom wywołującym pobieranie wartości odcisku palca certyfikatu przy użyciu algorytmów innych niż SHA-1.
Nowe Span<T>interfejsy API kryptografii oparte na kryptografii są dostępne do tworzenia skrótów, HMAC, kryptograficznego generowania liczb losowych, generowania sygnatur asymetrycznych, przetwarzania sygnatur asymetrycznych i szyfrowania RSA.
Wydajność programu System.Security.Cryptography.Rfc2898DeriveBytes wzrosła o około 15% przy użyciu implementacji opartej Span<T>na technologii .
Nowa System.Security.Cryptography.CryptographicOperations klasa zawiera dwie nowe metody:
FixedTimeEquals Zwracanie dwóch danych wejściowych o tej samej długości zajmuje stałej ilości czasu, co sprawia, że nadaje się do użycia w weryfikacji kryptograficznej, aby uniknąć współtworzenia informacji o kanale bocznym chronometrażu.
ZeroMemory jest procedurą czyszczenia pamięci, której nie można zoptymalizować.
Metoda statyczna RandomNumberGenerator.Fill wypełnia Span<T> wartości losowe.
Ta funkcja jest teraz obsługiwana System.Security.Cryptography.Pkcs.EnvelopedCms w systemach Linux i macOS.
Elliptic-Curve Diffie-Hellman (ECDH) jest teraz dostępny w System.Security.Cryptography.ECDiffieHellman rodzinie klas. Obszar powierzchni jest taki sam jak w programie .NET Framework.
Wystąpienie zwrócone przez RSA.Create usługę może szyfrować lub odszyfrowywać przy użyciu skrótu SHA-2, a także generować lub weryfikować podpisy przy użyciu rsA-PSS.
Ulepszenia gniazd
Platforma .NET Core zawiera nowy typ, System.Net.Http.SocketsHttpHandleri przepisany System.Net.Http.HttpMessageHandlerelement , który stanowi podstawę interfejsów API sieci wyższego poziomu. System.Net.Http.SocketsHttpHandlerna przykład jest podstawą implementacji HttpClient . W poprzednich wersjach platformy .NET Core interfejsy API wyższego poziomu były oparte na implementacjach sieci natywnych.
Implementacja gniazd wprowadzona na platformie .NET Core 2.1 ma wiele zalet:
Znacząca poprawa wydajności w porównaniu z poprzednią implementacją.
Eliminacja zależności platformy, co upraszcza wdrażanie i obsługę.
Spójne zachowanie na wszystkich platformach .NET Core.
SocketsHttpHandler to domyślna implementacja na platformie .NET Core 2.1. Można jednak skonfigurować aplikację tak, aby korzystała ze starszej HttpClientHandler klasy, wywołując metodę AppContext.SetSwitch :
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", False)
Możesz również użyć zmiennej środowiskowej, aby zrezygnować z używania implementacji gniazd opartych na .SocketsHttpHandler W tym celu ustaw wartość DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER
false
na wartość lub 0.
W systemie Windows można również użyć System.Net.Http.WinHttpHandlerklasy , która opiera się na natywnej implementacji lub SocketsHttpHandler klasie, przekazując wystąpienie klasy do konstruktora HttpClient .
W systemach Linux i macOS można skonfigurować HttpClient tylko dla poszczególnych procesów. W systemie Linux należy wdrożyć bibliotekę libcurl , jeśli chcesz użyć starej HttpClient implementacji. (Jest on instalowany przy użyciu platformy .NET Core 2.0).
Zmiany powodujące niezgodność
Aby uzyskać informacje o zmianach powodujących niezgodność, zobacz Istotne zmiany dotyczące migracji z wersji 2.0 do 2.1.