Wat is er nieuw in .NET Core 2.2?

.NET Core 2.2 bevat verbeteringen in de implementatie van toepassingen, gebeurtenisafhandeling voor runtimeservices, verificatie voor Azure SQL-databases, prestaties van JIT-compiler en code-injectie voordat de Main methode wordt uitgevoerd.

Nieuwe implementatiemodus

Vanaf .NET Core 2.2 kunt u frameworkafhankelijke uitvoerbare bestanden implementeren. Dit zijn .exe bestanden in plaats van .dll bestanden. Functioneel vergelijkbaar met frameworkafhankelijke implementaties, zijn frameworkafhankelijke uitvoerbare bestanden (FDE) nog steeds afhankelijk van de aanwezigheid van een gedeelde systeembrede versie van .NET Core die moet worden uitgevoerd. Uw app bevat alleen uw code en eventuele afhankelijkheden van derden. In tegenstelling tot frameworkafhankelijke implementaties zijn FD's platformspecifiek.

Deze nieuwe implementatiemodus heeft het unieke voordeel van het bouwen van een uitvoerbaar bestand in plaats van een bibliotheek, wat betekent dat u uw app rechtstreeks kunt uitvoeren zonder eerst aan te dotnet roepen.

Basis

Gebeurtenissen verwerken in runtimeservices

Mogelijk wilt u het gebruik van runtimeservices van uw toepassing controleren, zoals de GC, JIT en ThreadPool, om te begrijpen hoe deze van invloed zijn op uw toepassing. Op Windows-systemen wordt dit meestal gedaan door de ETW-gebeurtenissen van het huidige proces te bewaken. Hoewel dit goed blijft werken, is het niet altijd mogelijk om ETW te gebruiken als u werkt in een omgeving met lage bevoegdheden of in Linux of macOS.

Vanaf .NET Core 2.2 kunnen CoreCLR-gebeurtenissen nu worden gebruikt met behulp van de System.Diagnostics.Tracing.EventListener klasse. Deze gebeurtenissen beschrijven het gedrag van dergelijke runtimeservices als GC, JIT, ThreadPool en interop. Dit zijn dezelfde gebeurtenissen die worden weergegeven als onderdeel van de CoreCLR ETW-provider.  Hierdoor kunnen toepassingen deze gebeurtenissen gebruiken of een transportmechanisme gebruiken om ze naar een telemetrieaggregatieservice te verzenden. In het volgende codevoorbeeld ziet u hoe u zich abonneert op gebeurtenissen:

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");
    }
}

Daarnaast voegt .NET Core 2.2 de volgende twee eigenschappen toe aan de EventWrittenEventArgs klasse om aanvullende informatie over ETW-gebeurtenissen te bieden:

Gegevens

AAD-verificatie voor Azure SQL-databases met sql Verbinding maken ion. Eigenschap AccessToken

Vanaf .NET Core 2.2 kan een toegangstoken dat is uitgegeven door Azure Active Directory, worden gebruikt om te verifiëren bij een Azure SQL-database. Ter ondersteuning van toegangstokens is de AccessToken eigenschap toegevoegd aan de SqlConnection klasse. Als u wilt profiteren van AAD-verificatie, downloadt u versie 4.6 van het NuGet-pakket System.Data.SqlClient. Als u de functie wilt gebruiken, kunt u de waarde van het toegangstoken verkrijgen met behulp van de Active Directory Authentication Library voor .NET in het Microsoft.IdentityModel.Clients.ActiveDirectory NuGet-pakket.

JIT-compilerverbeteringen

Gelaagde compilatie blijft een opt-in-functie

In .NET Core 2.1 heeft de JIT-compiler een nieuwe compilertechnologie, gelaagde compilatie, geïmplementeerd als opt-in-functie. Het doel van gelaagde compilatie is verbeterde prestaties. Een van de belangrijke taken die door de JIT-compiler worden uitgevoerd, is het optimaliseren van de uitvoering van code. Voor weinig gebruikte codepaden kan de compiler echter meer tijd besteden aan het optimaliseren van code dan de runtime besteedt aan het uitvoeren van niet-geoptimaliseerde code. Gelaagde compilatie introduceert twee fasen in JIT-compilatie:

  • Een eerste laag, waarmee code zo snel mogelijk wordt gegenereerd.

  • Een tweede laag, waarmee geoptimaliseerde code wordt gegenereerd voor methoden die regelmatig worden uitgevoerd. De tweede compilatielaag wordt parallel uitgevoerd voor verbeterde prestaties.

Zie Aankondiging van .NET Core 2.2 Preview 2 voor informatie over de prestatieverbetering die kan voortvloeien uit gelaagde compilatie.

Zie Jit-compilerverbeteringen in Wat is er nieuw in .NET Core 2.1 voor informatie over het aanmelden voor gelaagde compilatie.

Runtime

Code injecteren voordat de Main-methode wordt uitgevoerd

Vanaf .NET Core 2.2 kunt u een opstarthook gebruiken om code te injecteren voordat u de Main-methode van een toepassing uitvoert. Opstarthook maakt het mogelijk voor een host om het gedrag van toepassingen aan te passen nadat ze zijn geïmplementeerd zonder dat de toepassing opnieuw hoeft te worden gecompileerd of gewijzigd.

We verwachten dat hostingproviders aangepaste configuratie en beleid definiëren, inclusief instellingen die mogelijk van invloed zijn op het laadgedrag van het hoofdinvoerpunt, zoals het System.Runtime.Loader.AssemblyLoadContext gedrag. De hook kan worden gebruikt om tracering of telemetrie-injectie in te stellen, callbacks in te stellen voor verwerking of om ander omgevingsafhankelijk gedrag te definiëren. De haak staat los van het toegangspunt, zodat de gebruikerscode niet hoeft te worden gewijzigd.

Zie Host startup hook voor meer informatie.

Zie ook