Aankondiging van .NET 7 Preview 3

Vandaag zijn we verheugd om de release van .NET 7 Preview 3. De derde preview van .NET 7 bevat verbeteringen aan de zichtbaarheid, opstarttijden, codegen, GC-regio’s, native AOT-compilatie en meer.

Door: Jon Douglas

De bits zijn nu beschikbaar om te pakken en te beginnen met experimenteren met nieuwe functies zoals:

  • Inheemse AOT
  • Standaard GC-regio’s
  • Verbeteringen in de opstarttijd van ASP.NET Core

U kunt .NET 7 Preview 3 downloaden voor Windows, macOS en Linux.

.NET 7 Preview 3 is getest met Visual Studio 17.2 Preview 3. We raden u aan de preview-kanaalbuilds te gebruiken als u .NET 7 wilt proberen met producten uit de Visual Studio-familie. Visual Studio voor Mac-ondersteuning voor .NET 7-previews is nog niet beschikbaar, maar komt binnenkort. Laten we nu ingaan op enkele van de nieuwste updates in deze release.

Snellere, lichtere apps met Native AOT

In de .NET 7 Preview 2 blogpost hebben we aangekondigd dat het Native AOT-project uit de experimentele status is verplaatst naar de hoofdontwikkeling in .NET 7 in de dotnet/runtime repo. We weten dat velen van jullie reikhalzend hebben uitgekeken naar updates van het team over wat er gaat komen voor Native AOT, en we hebben een aantal nieuwe updates voor jullie voor Preview 3.

Als je details wilt over Native AOT, of om erin te springen en ermee aan de slag te gaan, zijn de repo-documenten daarvoor de beste plaats.

We erkennen ook dat sommigen van jullie misschien niet bekend zijn met wat Native AOT is, dus we wilden er een snel overzicht van met jullie delen.

Wat is Native AOT?

Ahead-of-time (AOT) compilatie verwijst naar een paraplu van technologieën die code genereren tijdens het bouwen van applicaties, in plaats van tijdens runtime. AOT is niet nieuw voor .NET. Vandaag leveren we ReadyToRun voor client- en serverscenario’s, en Mono AOT voor mobiel en WASM. Native AOT brengt volledige native pre-compilatie naar .NET desktop-client- en serverscenario’s. Native AOT vervangt deze bestaande technologieën niet, maar biedt een nieuwe reeks mogelijkheden die nieuwe vormfactoren ontsluiten.

Bestaande AOT-gecompileerde .NET-assembly’s bevatten platformspecifieke datastructuren en native code om werk dat doorgaans tijdens runtime wordt gedaan, vooraf te laden. Het vooraf compileren van deze artefacten bespaart tijd bij het opstarten (bijv. ReadyToRun) en maakt toegang tot no-JIT-platforms (bijv. iOS) mogelijk. Als er geen voorgecompileerde artefacten aanwezig zijn, valt .NET ofwel terug op JIT of interpretatie (afhankelijk van het platform).

Native AOT is vergelijkbaar met de bestaande AOT-technologieën van .NET, maar produceert alleen native artefacten. In feite weet de Native AOT-runtime niet hoe de .NET-assemblagebestandsindelingen moeten worden gelezen – alles is platformeigen. Het ontleden van de uitvoerbare bestandsindeling wordt volledig afgehandeld door het onderliggende besturingssysteem.

Het belangrijkste voordeel van Native AOT is de opstarttijd, geheugengebruik, toegang tot beperkte platforms (geen JIT toegestaan) en kleinere schijfgrootte. Toepassingen beginnen te draaien op het moment dat het besturingssysteem ze in het geheugen plaatst. De datastructuren zijn geoptimaliseerd voor het uitvoeren van door AOT gegenereerde code, niet voor het compileren van nieuwe code tijdens runtime. Dit is vergelijkbaar met hoe talen als Go, Swift en Rust compileren. Native AOT is het meest geschikt voor omgevingen waar de opstarttijd het belangrijkst is. Targeting Native AOT heeft strengere eisen dan algemene .NET Core/5+ applicaties en bibliotheken. Native AOT verbiedt het verzenden van nieuwe code tijdens runtime (bijv. Reflection.Emit) en het laden van nieuwe .NET-assemblies tijdens runtime (bijv. plug-in-modellen).

Bereid uw apps voor op Native AOT

Voor .NET 7 richten we ons op console-apps en native bibliotheken als het primaire scenario voor Native AOT. Applicatieontwikkelaars en bibliotheekauteurs kunnen nu profiteren van Native AOT door ervoor te zorgen dat hun applicaties kunnen worden bijgesneden. Aangezien trimmen een vereiste is voor Native AOT-compilatie, zal het voorbereiden van uw applicaties en bibliotheken nu voor trimmen hen ook helpen om zich voor te bereiden op Native AOT. Als u een auteur bent van .NET-bibliotheken, zal het volgen van de instructies voor het trimmen van bibliotheken u specifiek helpen uw bibliotheken voor te bereiden op trimmen en Native AOT.

Een van de apps die we in .NET 7 willen leveren, gecompileerd met Native AOT, is de crossgen-tool. Crossgen maakt deel uit van de .NET SDK. Het is de CoreCLR AOT-compiler die ReadyToRun-uitvoerbare bestanden produceert. Crossgen is geschreven in C# en we verzenden het momenteel gecompileerd met zichzelf als een ReadyToRun-app (het zijn schildpadden helemaal naar beneden!). We zien al een aantal veelbelovende cijfers in termen van compilatiesnelheid en -grootte. Crossgen profiteert sterk van Native AOT omdat het een proces van korte duur is en de opstartoverhead de algehele uitvoeringstijd domineert:

Scenario

ReadyToRun

NativeAOT

Compileer CoreLib 4182 ms 3512 ms
Compileer HelloWorld 185 ms 49 ms
Configuratie Size
Klaar om te rennen 34,8 MB
NativeAOT 17,6 MB

Vooruitkijkend zal de Native AOT-compatibiliteit in de komende paar versies van .NET worden verbeterd, maar er zullen altijd redenen zijn om voor veel scenario’s de voorkeur te geven aan JIT. We zullen ook eersteklas ondersteuning toevoegen aan de dotnet SDK voor het publiceren van projecten met Native AOT.

waarneembaarheid

.NET 7 blijft de ondersteuning voor de cloud-native OpenTelemetry-specificatie ontwikkelen. Preview 3 voegt ondersteuning toe voor specificatie-updates #988 en #1708 die de traceerstatus veranderbaar maken voor samplers.

  //  ActivityListener Sampling callback
    listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) =>
    {
        activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" };
        return ActivitySamplingResult.AllDataAndRecorded;
    };

Systeem.Compositie.Hosting

Het nieuwste Managed Extensibility Framework krijgt een kleine update om af te stemmen op de vorige versie API’s. Met de nieuwe API’s kan een enkele objectinstantie aan de System.Composition.Hosting-container worden toegevoegd . Vergelijkbaar met de functionaliteit van de legacy-interfaces System.ComponentModel.Composition.Hosting met de API ComposeExportedValue(CompositionContainer, T)

Voorstel: injecteer bestaand object in MEF2

namespace System.Composition.Hosting
{
    public class ContainerConfiguration
    {
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance);
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);

        public ContainerConfiguration WithExport(Type contractType, object exportedInstance);
        public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
    }
}

Verbeterde opstarttijd met Write-Xor-Execute ingeschakeld

Prestaties blijven een belangrijk aandachtspunt voor .NET 7. De dotnet/runtime#65738 PR herimplementeerde de precode en call counting stubs (tiered compilatie helper stubs) om het aantal post-creatie wijzigingen van uitvoerbare code in de runtime aanzienlijk te verminderen. Dit resulteerde in een verbetering van de opstarttijd van 10-15%.

Als bonus resulteerde deze verandering ook in stabiele prestatieverbeteringen (tot 8%) in sommige microbenchmarks en sommige ASPNet-benchmarks, zelfs zonder dat Write-Xor-Execute is ingeschakeld.

Er zijn echter ook weinig regressies als gevolg van die wijziging (zonder Write-Xor-Execute ingeschakeld) die in de komende preview-releases zullen worden aangepakt. Deze werden alleen waargenomen in de Orchard- en Fortunes-benchmarks op Intel-processors.

CodeGen

Voor een groot deel dankzij bijdragers uit de gemeenschap, biedt Preview 3 verschillende optimalisaties en bugfixes voor het genereren van code en just-in-time (JIT)-compilatie. Hier is een overzicht van de wijzigingen die vandaag beschikbaar zijn.

Community-PR’s

Deze pull-verzoeken zijn allemaal geïnitieerd door communitybijdragers.

Van @clamp03
Van @SkiFoD
Van @sandreenko
Van @SingleAccretion
Van @trympet
Van @Wraith2

Dynamische PGO

Arm64

Loop-optimalisaties

  • Loop Cloning verbeterde de duur van een enkele aanroep met 21% voor System.Collections.Tests.Perf_BitArray.BitArrayLeftShift(Size: 512):
    afbeelding
    Bron: devblogs

Algemene optimalisaties

GC-regio’s standaard ingeschakeld

Met Preview 3 is de regiofunctionaliteit die zou moeten helpen bij het geheugengebruik voor toepassingen met een hoge doorvoer standaard ingeschakeld. De functionaliteit is nu ingeschakeld voor alle platforms behalve MacOS en NativeAOT (die in de toekomst zouden worden ingeschakeld). Meer details zijn beschikbaar in dit nummer: https://github.com/dotnet/runtime/issues/43844

We verwachten enige verhoging van de werkset voor kleinere toepassingen vanwege de aanvankelijke toewijzing van regio’s. Als u functionele of prestatieverschillen opmerkt, maak dan een probleem aan in de runtime-repo.

Cryptografie: X.500-namen robuuster genereren

Deze wijziging vereenvoudigt het werken met certificaten door een klasse te introduceren die meer duidelijkheid biedt bij het ontleden van X.500-namen.

Maak het veiliger en gemakkelijker om een ​​X500DistinguishedName te bouwen

Klassiek deed iedereen die een X.500-naam wilde bouwen (zoals voor het maken van testcertificaten met de CertificateRequestklasse, dit met tekenreeksmanipulatie, hetzij via een eenvoudige letterlijke of met tekenreeksopmaak, bijv.

request = new CertificateRequest($"CN={subjectName},OU=Test,O=""Fabrikam, Inc.""", ...);

Dit is over het algemeen prima, behalve wanneer subjectNamehet een komma, aanhalingsteken of iets anders bevat dat van invloed is op de parser. Om dat aan te pakken, hebben we de X500DistinguishedNameBuilderklasse toegevoegd. Omdat elke methode slechts op één enkele relatieve DN-naam (RDN) werkt, is er geen dubbelzinnigheid bij het parseren. Als een bonus, aangezien de RDN-ID’s zijn uitgebreid, hoeft u niet langer te raden waar “CN” voor staat (“Algemene naam”).

X500DistinguishedNameBuilder nameBuilder = new();
nameBuilder.AddCommonName(subjectName);
nameBuilder.AddOrganizationalUnitName("Test");
nameBuilder.AddOrganizationName("Fabrikam, Inc.");

request = new CertificateRequest(nameBuilder.Build(), ...);

Targeting op .NET 7

Om .NET 7 te targeten, moet u een .NET 7 Target Framework Moniker (TFM) gebruiken in uw projectbestand. Bijvoorbeeld:

<TargetFramework>net7.0</TargetFramework>

De volledige set .NET 7 TFM’s, inclusief bedrijfsspecifieke TFM’s, volgt.

  • net7.0
  • net7.0-android
  • net7.0-ios
  • net7.0-maccatalyst
  • net7.0-macos
  • net7.0-tvos
  • net7.0-windows

We verwachten dat het upgraden van .NET 6 naar .NET 7 eenvoudig moet zijn. Rapporteer alle belangrijke wijzigingen die u ontdekt tijdens het testen van bestaande apps met .NET 7.

Steun

.NET 7 is een huidige release, wat betekent dat het 18 maanden lang gratis ondersteuning en patches ontvangt vanaf de releasedatum. Het is belangrijk op te merken dat de kwaliteit van alle releases hetzelfde is. Het enige verschil is de lengte van de ondersteuning. Zie het officiële ondersteuningsbeleid voor .NET en .NET Core voor meer informatie over het .NET-ondersteuningsbeleid .

Brekende veranderingen

U kunt de meest recente lijst met belangrijke wijzigingen in .NET 7 vinden door het document Brekende wijzigingen in .NET 7 te lezen . Het geeft een overzicht van de belangrijkste wijzigingen per gebied en release met links naar gedetailleerde uitleg.

Om te zien welke belangrijke wijzigingen zijn voorgesteld maar nog worden beoordeeld, volgt u de GitHub-uitgave Proposed .NET Breaking Changes .

Wegenkaarten

Releases van .NET omvatten producten, bibliotheken, runtime en tooling en vertegenwoordigen een samenwerking tussen meerdere teams binnen en buiten Microsoft. U kunt meer over deze gebieden te weten komen door de product-roadmaps te lezen:

Sluitend

Door: Jon Douglas, Senior Program Manager, NuGet  |  Bron: .NET-blog

Lees het originele artikel hier.

We waarderen en danken u voor al uw steun en bijdragen aan .NET. Probeer .NET 7 Preview 3 eens en vertel ons wat je ervan vindt!