.NET Standard

.NET Standard is een formele specificatie van .NET API's die beschikbaar zijn voor meerdere .NET-implementaties. De motivatie achter .NET Standard was om meer uniformiteit in het .NET-ecosysteem tot stand te brengen. .NET 5 en latere versies gaan over op een andere manier om uniformiteit tot stand te brengen, waardoor .NET Standard in de meeste scenario's niet meer nodig is. Als u echter code wilt delen tussen .NET Framework en andere .NET-implementaties, zoals .NET Core, moet uw bibliotheek zich richten op .NET Standard 2.0. Er worden geen nieuwe versies van .NET Standard uitgebracht, maar .NET 5 en alle latere versies blijven .NET Standard 2.1 en eerder ondersteunen.

Zie .NET 5+ en .NET Standard verderop in dit artikel voor meer informatie over het kiezen tussen .NET 5+ en .NET Standard .

.NET Standard-versies

.NET Standard is versiebeheer. Elke nieuwe versie voegt meer API's toe. Wanneer een bibliotheek is gebouwd op basis van een bepaalde versie van .NET Standard, kan deze worden uitgevoerd op elke .NET-implementatie die die versie van .NET Standard (of hoger) implementeert.

Als u een hogere versie van .NET Standard wilt gebruiken, kan een bibliotheek meer API's gebruiken, maar dit betekent dat deze alleen kan worden gebruikt in recentere versies van .NET. Als u een lagere versie wilt gebruiken, worden de beschikbare API's verminderd, maar betekent dit dat de bibliotheek op meer plaatsen kan worden uitgevoerd.

.NET Standard-versie selecteren

.NET Standard 1.0 heeft 7.949 van de 37.118 beschikbare API's.

.NET-implementatie Versieondersteuning
.NET en .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
Universeel Windows-platform 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

Zie .NET Standard 1.0 voor meer informatie. Zie .NET Standard-versies voor een interactieve tabel.

Welke .NET Standard-versie moet worden gebruikt

U wordt aangeraden .NET Standard 2.0 te targeten, tenzij u een eerdere versie moet ondersteunen. De meeste bibliotheken voor algemeen gebruik mogen geen API's nodig hebben buiten .NET Standard 2.0. .NET Standard 2.0 wordt ondersteund door alle moderne platforms en is de aanbevolen manier om meerdere platforms met één doel te ondersteunen.

Als u .NET Standard 1.x wilt ondersteunen, raden we u aan ook .NET Standard 2.0 te targeten. .NET Standard 1.x wordt gedistribueerd als een gedetailleerde set NuGet-pakketten, waarmee een grote pakketafhankelijkheidsgrafiek wordt gemaakt en ontwikkelaars veel pakketten downloaden bij het bouwen. Zie platformoverschrijdende targeting en .NET 5+ en .NET Standard verderop in dit artikel voor meer informatie.

.NET Standard-versiebeheerregels

Er zijn twee primaire versiebeheerregels:

  • Additief: .NET Standard-versies zijn logisch concentrische cirkels: hogere versies bevatten alle API's uit eerdere versies. Er zijn geen belangrijke wijzigingen tussen versies.
  • Onveranderbaar: na verzending worden .NET Standard-versies geblokkeerd.

Er zijn geen nieuwe .NET Standard-versies na 2.1. Zie .NET 5+ en .NET Standard verderop in dit artikel voor meer informatie.

Specificatie

De .NET Standard-specificatie is een gestandaardiseerde set API's. De specificatie wordt onderhouden door .NET-implementers, met name Microsoft (inclusief .NET Framework, .NET Core en Mono) en Unity.

Officiële artefacten

De officiële specificatie is een set .cs bestanden die de API's definiëren die deel uitmaken van de standaard. De verw-map in de (nu gearchiveerde) dotnet/standard-opslagplaats definieert de .NET Standard-API's.

De metapackage (bron) van NETStandard.Library beschrijft de set bibliotheken die een of meer .NET Standard-versies definiëren (in deel).

Een bepaald onderdeel, zoals System.Runtime, beschrijft:

  • Onderdeel van .NET Standard (alleen het bereik).
  • Meerdere versies van .NET Standard voor dat bereik.

Afgeleide artefacten worden geleverd om handiger te lezen en bepaalde scenario's voor ontwikkelaars in te schakelen (bijvoorbeeld met behulp van een compiler).

Pakketweergave

Het primaire distributievoertuig voor de .NET Standard-referentieassembly's is NuGet-pakketten. Implementaties worden op verschillende manieren geleverd, geschikt voor elke .NET-implementatie.

NuGet-pakketten zijn gericht op een of meer frameworks. .NET Standard-pakketten zijn gericht op het framework .NET Standard. U kunt het .NET Standard-framework richten met behulp van de netstandardcompacte TFM (bijvoorbeeld netstandard1.4). Bibliotheken die zijn bedoeld om te worden uitgevoerd op meerdere implementaties van .NET, moeten gericht zijn op dit framework. Voor de breedste set API's is het doel netstandard2.0 omdat het aantal beschikbare API's meer dan verdubbeld tussen .NET Standard 1.6 en 2.0.

De NETStandard.Library metapackage verwijst naar de volledige set NuGet-pakketten die .NET Standard definiëren. De meest voorkomende manier om te targeten netstandard is door te verwijzen naar deze metapackage. Het beschrijft en biedt toegang tot de ~40 .NET-bibliotheken en bijbehorende API's die .NET Standard definiëren. U kunt verwijzen naar aanvullende pakketten die zijn gericht netstandard om toegang te krijgen tot aanvullende API's.

Versiebeheer

De specificatie is niet enkelvoudig, maar een lineair geversieerde set API's. Met de eerste versie van de standaard wordt een basislijnset API's ingesteld. Volgende versies voegen API's toe en nemen API's over die zijn gedefinieerd door eerdere versies. Er is geen vastgestelde inrichting voor het verwijderen van API's uit de Standard.

.NET Standard is niet specifiek voor één .NET-implementatie en komt ook niet overeen met het versiebeheerschema van een van deze implementaties.

Zoals eerder vermeld, zijn er geen nieuwe .NET Standard-versies na 2.1.

Doel .NET Standard

U kunt .NET Standard-bibliotheken bouwen met behulp van een combinatie van het netstandard framework en de NETStandard.Library metapackage.

.NET Framework-compatibiliteitsmodus

Vanaf .NET Standard 2.0 is de .NET Framework-compatibiliteitsmodus geïntroduceerd. Met deze compatibiliteitsmodus kunnen .NET Standard-projecten verwijzen naar .NET Framework-bibliotheken alsof ze zijn gecompileerd voor .NET Standard. Verwijzingen naar .NET Framework-bibliotheken werken niet voor alle projecten, zoals bibliotheken die gebruikmaken van WPF-API's (Windows Presentation Foundation).

Zie de .NET Framework-compatibiliteitsmodus voor meer informatie.

.NET Standard-bibliotheken en Visual Studio

Als u .NET Standard-bibliotheken wilt bouwen in Visual Studio, moet u Visual Studio 2022, Visual Studio 2019 of Visual Studio 2017 versie 15.3 of hoger hebben geïnstalleerd in Windows of Visual Studio voor Mac versie 7.1 of hoger op macOS.

Als u alleen .NET Standard 2.0-bibliotheken in uw projecten hoeft te gebruiken, kunt u dat ook doen in Visual Studio 2015. U moet echter NuGet-client 3.6 of hoger hebben geïnstalleerd. U kunt de NuGet-client voor Visual Studio 2015 downloaden via de NuGet-downloadpagina .

.NET 5+ en .NET Standard

.NET 5, .NET 6, .NET 7 en .NET 8 zijn afzonderlijke producten met een uniforme set mogelijkheden en API's die kunnen worden gebruikt voor Windows-desktop-apps en platformoverschrijdende console-apps, cloudservices en websites. De .NET 8 TFM's weerspiegelen bijvoorbeeld dit brede scala aan scenario's:

  • net8.0

    Deze TFM is bedoeld voor code die overal wordt uitgevoerd. Met een paar uitzonderingen omvat het alleen technologieën die platformoverschrijdend werken. Voor .NET 8-code net8.0 vervangt u beide netcoreapp en netstandard TFM's.

  • net8.0-windows

    Dit is een voorbeeld van een besturingssysteemspecifieke TFM die besturingssysteemspecifieke functionaliteit toevoegt aan alles waarnaar net8.0 wordt verwezen.

Wanneer moet u zich richten op net8.0 versus netstandard

Voor bestaande code die is bedoeld netstandard, hoeft u de TFM niet te wijzigen in net8.0 of een nieuwere TFM. .NET 8 implementeert .NET Standard 2.1 en eerder. De enige reden om van .NET Standard naar .NET 8+ te retarget, is om toegang te krijgen tot meer runtimefuncties, taalfuncties of API's. Als u bijvoorbeeld C# 9 wilt gebruiken, moet u zich richten op .NET 5 of een latere versie. U kunt multitarget .NET 8 en .NET Standard gebruiken om toegang te krijgen tot nieuwere functies en nog steeds uw bibliotheek beschikbaar te maken voor andere .NET-implementaties.

Hier volgen enkele richtlijnen voor nieuwe code voor .NET 5+:

  • App-onderdelen

    Als u bibliotheken gebruikt om een toepassing op te splitsen in verschillende onderdelen, raden we u aan om het doel te bereiken net8.0. Om het eenvoudig te houden, is het raadzaam om alle projecten waaruit uw toepassing bestaat in dezelfde versie van .NET te houden. Vervolgens kunt u overal dezelfde BCL-functies aannemen.

  • Herbruikbare bibliotheken

    Als u herbruikbare bibliotheken bouwt die u op NuGet wilt verzenden, kunt u rekening houden met de afweging tussen bereik en beschikbare functieset. .NET Standard 2.0 is de nieuwste versie die wordt ondersteund door .NET Framework, zodat het goed bereik biedt met een redelijk grote functieset. We raden u niet aan om .NET Standard 1.x te gebruiken, omdat u de beschikbare functieset voor een minimale toename van het bereik beperkt.

    Als u .NET Framework niet hoeft te ondersteunen, kunt u gebruikmaken van .NET Standard 2.1 of .NET 8. We raden u aan .NET Standard 2.1 over te slaan en rechtstreeks naar .NET 8 te gaan. De meest gebruikte bibliotheken hebben meerdere doelen voor zowel .NET Standard 2.0 als .NET 5+. Ondersteuning voor .NET Standard 2.0 biedt u het meeste bereik, terwijl u .NET 5+ ondersteunt, ervoor zorgt dat u de nieuwste platformfuncties kunt gebruiken voor klanten die al .NET 5+ gebruiken.

Problemen met .NET Standard

Hier volgen enkele problemen met .NET Standard die helpen uitleggen waarom .NET 5 en latere versies de betere manier zijn om code te delen tussen platforms en workloads:

  • Traagheid bij het toevoegen van nieuwe API's

    .NET Standard is gemaakt als een API-set die alle .NET-implementaties zouden moeten ondersteunen, dus er was een beoordelingsproces voor voorstellen om nieuwe API's toe te voegen. Het doel was om alleen API's te standaardiseren die kunnen worden geïmplementeerd in alle huidige en toekomstige .NET-platforms. Het resultaat was dat als een functie een bepaalde release miste, u mogelijk een paar jaar moet wachten voordat deze is toegevoegd aan een versie van de Standard. Vervolgens zou u nog langer wachten totdat de nieuwe versie van .NET Standard algemeen wordt ondersteund.

    Oplossing in .NET 5+: Wanneer een functie wordt geïmplementeerd, is deze al beschikbaar voor elke .NET 5+-app en -bibliotheek omdat de codebasis wordt gedeeld. En omdat er geen verschil is tussen de API-specificatie en de implementatie ervan, kunt u veel sneller profiteren van nieuwe functies dan met .NET Standard.

  • Complexe versiebeheer

    De scheiding van de API-specificatie van de implementaties resulteert in complexe toewijzing tussen API-specificatieversies en implementatieversies. Deze complexiteit is duidelijk in de tabel die eerder in dit artikel is weergegeven en de instructies voor het interpreteren ervan.

    Oplossing in .NET 5+: er is geen scheiding tussen een .NET 5+ API-specificatie en de implementatie ervan. Het resultaat is een vereenvoudigd TFM-schema. Er is één TFM-voorvoegsel voor alle workloads: net8.0 wordt gebruikt voor bibliotheken, console-apps en web-apps. De enige variatie is een achtervoegsel waarmee platformspecifieke API's voor een bepaald platform worden opgegeven, zoals net8.0-windows. Dankzij deze TFM-naamconventie kunt u eenvoudig zien of een bepaalde app een bepaalde bibliotheek kan gebruiken. Er zijn geen versienummerequivalententabel nodig, zoals de tabel voor .NET Standard.

  • Platform-niet-ondersteunde uitzonderingen tijdens runtime

    .NET Standard biedt platformspecifieke API's. Uw code kan zonder fouten worden gecompileerd en lijkt overdraagbaar te zijn naar elk platform, zelfs als deze niet draagbaar is. Wanneer het wordt uitgevoerd op een platform dat geen implementatie voor een bepaalde API heeft, krijgt u runtimefouten.

    Oplossing in .NET 5+: De .NET 5+ SDK's bevatten codeanalyses die standaard zijn ingeschakeld. De platformcompatibiliteitsanalyse detecteert onbedoeld gebruik van API's die niet worden ondersteund op de platforms waarop u wilt uitvoeren. Zie platformcompatibiliteitsanalyse voor meer informatie.

.NET Standard is niet afgeschaft

.NET Standard is nog steeds nodig voor bibliotheken die kunnen worden gebruikt door meerdere .NET-implementaties. In de volgende scenario's wordt u aangeraden .NET Standard te targeten:

  • Gebruik netstandard2.0 dit om code te delen tussen .NET Framework en alle andere implementaties van .NET.
  • Gebruik netstandard2.1 dit om code te delen tussen Mono, Xamarin en .NET Core 3.x.

Zie ook