Udostępnij za pośrednictwem


Co nowego w programie .NET Core 2.2

Platforma .NET Core 2.2 obejmuje ulepszenia wdrażania aplikacji, obsługę zdarzeń dla usług środowiska uruchomieniowego, uwierzytelnianie w bazach danych Azure SQL Database, wydajność kompilatora JIT i iniekcję kodu przed wykonaniem Main metody.

Nowy tryb wdrażania

Począwszy od platformy .NET Core 2.2, można wdrażać pliki wykonywalne zależne od platformy, które są plikami.exe zamiast plików.dll . Funkcjonalnie podobne do wdrożeń zależnych od platformy pliki wykonywalne zależne od platformy (FDE) nadal polegają na obecności udostępnionej wersji platformy .NET Core dla całego systemu. Aplikacja zawiera tylko twój kod i zewnętrzne zależności. W przeciwieństwie do wdrożeń zależnych od platformy FDEs są specyficzne dla platformy.

Ten nowy tryb wdrażania ma wyraźną zaletę tworzenia pliku wykonywalnego zamiast biblioteki, co oznacza, że można uruchamiać aplikację bezpośrednio bez wywoływania dotnet najpierw.

Rdzeń

Obsługa zdarzeń w usługach środowiska uruchomieniowego

Często warto monitorować korzystanie z usług środowiska uruchomieniowego aplikacji, takich jak GC, JIT i ThreadPool, aby zrozumieć, jak wpływają one na aplikację. W systemach Windows jest to często wykonywane przez monitorowanie zdarzeń ETW bieżącego procesu. Mimo że nadal działa dobrze, nie zawsze można używać funkcji ETW, jeśli korzystasz ze środowiska o niskich uprawnieniach lub w systemie Linux lub macOS.

Począwszy od platformy .NET Core 2.2, zdarzenia CoreCLR mogą być teraz używane przy użyciu klasy System.Diagnostics.Tracing.EventListener. Te zdarzenia opisują zachowanie takich usług środowiska uruchomieniowego, jak GC, JIT, ThreadPool i interoperacyjność. Te same zdarzenia są ujawniane jako część dostawcy CoreCLR ETW.  Dzięki temu aplikacje mogą korzystać z tych zdarzeń lub używać mechanizmu transportu do wysyłania ich do usługi agregacji telemetrii. Możesz zobaczyć, jak subskrybować zdarzenia w poniższym przykładzie kodu:

internal sealed class SimpleEventListener : EventListener
{
    // Called whenever an EventSource is created.
    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        // Watch for the .NET runtime EventSource and enable all of its events.
        if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime"))
        {
            EnableEvents(eventSource, EventLevel.Verbose, (EventKeywords)(-1));
        }
    }

    // Called whenever an event is written.
    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        // Write the contents of the event to the console.
        Console.WriteLine($"ThreadID = {eventData.OSThreadId} ID = {eventData.EventId} Name = {eventData.EventName}");
        for (int i = 0; i < eventData.Payload.Count; i++)
        {
            string payloadString = eventData.Payload[i]?.ToString() ?? string.Empty;
            Console.WriteLine($"\tName = \"{eventData.PayloadNames[i]}\" Value = \"{payloadString}\"");
        }
        Console.WriteLine("\n");
    }
}

Ponadto platforma .NET Core 2.2 dodaje następujące dwie właściwości do EventWrittenEventArgs klasy w celu udostępnienia dodatkowych informacji o zdarzeniach ETW:

Dane

Uwierzytelnianie za pomocą Azure Active Directory (AAD) w bazach danych Azure SQL przy użyciu właściwości SqlConnection.AccessToken

Począwszy od platformy .NET Core 2.2, token dostępu wystawiony przez usługę Azure Active Directory może służyć do uwierzytelniania w bazie danych Azure SQL Database. Aby obsługiwać tokeny dostępu, AccessToken właściwość została dodana do SqlConnection klasy . Aby skorzystać z uwierzytelniania usługi AAD, pobierz wersję 4.6 pakietu NuGet System.Data.SqlClient. Aby użyć tej funkcji, można uzyskać wartość tokenu dostępu przy użyciu biblioteki uwierzytelniania usługi Active Directory dla platformy .NET zawartej w pakiecie Microsoft.IdentityModel.Clients.ActiveDirectory NuGet.

Ulepszenia kompilatora JIT

Kompilacja warstwowa pozostaje funkcją zgody

W programie .NET Core 2.1 kompilator JIT zaimplementował nową technologię kompilatora, kompilację warstwową jako funkcję opt-in. Celem kompilacji warstwowej jest poprawa wydajności. 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ż runtime na wykonanie 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.

Aby uzyskać informacje na temat poprawy wydajności, które mogą wynikać z kompilacji warstwowej, zobacz Ogłoszenie programu .NET Core 2.2 (wersja zapoznawcza 2).

Aby uzyskać informacje o wyrażeniu zgody na kompilację warstwową, zobacz Ulepszenia kompilatora Jit w temacie Co nowego w programie .NET Core 2.1.

Środowisko uruchomieniowe

Wstrzykiwanie kodu przed wykonaniem metody Main

Począwszy od platformy .NET Core 2.2, można użyć haka startowego do wstrzykiwania kodu przed uruchomieniem metody Main aplikacji. Haki uruchamiania umożliwiają hostowi dostosowanie zachowania aplikacji po ich wdrożeniu bez konieczności ponownego kompilowania lub zmieniania aplikacji.

Oczekujemy, że dostawcy hostingu będą definiować niestandardową konfigurację i zasady, w tym ustawienia, które potencjalnie wpływają na zachowanie podczas obciążenia w głównym punkcie wejścia, takie jak zachowanie System.Runtime.Loader.AssemblyLoadContext. Hook może służyć do ustawiania śledzenia lub iniekcji telemetrii, ustawiania wywołań zwrotnych do obsługi lub definiowania innego zachowania zależnego od środowiska. Hak jest oddzielony od punktu wejścia, dlatego kod użytkownika nie musi być modyfikowany.

Aby uzyskać więcej informacji, zobacz Host startup hook (Punkt zaczepienia uruchamiania hosta ).

Zobacz także