.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.
.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
Als u zich richt op .NET Standard, raden we u aan .NET Standard 2.0 te targeten, tenzij u een eerdere versie moet ondersteunen. De meeste bibliotheken voor algemeen gebruik moeten geen API's nodig hebben buiten .NET Standard 2.0 en .NET Framework biedt geen ondersteuning voor .NET Standard 2.1. .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, waardoor een grote pakketafhankelijkheidsgrafiek wordt gemaakt en dat er veel pakketten worden gedownload wanneer het project wordt gebouwd. Zie platformoverschrijdende targeting en .NET 5+ en .NET Standard verderop in dit artikel voor meer informatie.
Notitie
Vanaf .NET 9 wordt er een buildwaarschuwing verzonden als uw project is gericht op .NET Standard 1.x. Zie Waarschuwing die wordt verzonden voor .NET Standard 1.x-doelen 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).
- API-lijst in Markdown.
- Referentieassembly's, gedistribueerd als NuGet-pakketten en waarnaar wordt verwezen door de METApackage NETStandard.Library .
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 netstandard
compacte target framework moniker (TFM) bijvoorbeeld netstandard1.4
. Bibliotheken die zijn bedoeld om te worden uitgevoerd op meerdere implementaties van .NET, moeten gericht zijn op het .NET Standard-framework. Voor de breedste set API's, 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.
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, .NET 8 en .NET 9 zijn één product 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 beidenetcoreapp
ennetstandard
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 net8.0
op vs. netstandard
Voor bestaande code die is gericht op .NET Standard 2.0 of hoger, 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.
Notitie
Als uw project is gericht op .NET Standard 1.x, raden we u aan om het opnieuw te instellen op .NET Standard 2.0 of .NET 6+. Zie Waarschuwing die wordt verzonden voor .NET Standard 1.x-doelen voor meer informatie.
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 zich richten op .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. Meest gebruikte bibliotheken voor 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, zoalsnet8.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.