.NET Standard
.NET Standard är en formell specifikation av .NET-API:er som är tillgängliga för flera .NET-implementeringar. Motivationen bakom .NET Standard var att etablera större enhetlighet i .NET-ekosystemet. .NET 5 och senare versioner använder en annan metod för att fastställa enhetlighet som eliminerar behovet av .NET Standard i de flesta scenarier. Men om du vill dela kod mellan .NET Framework och andra .NET-implementeringar, till exempel .NET Core, bör biblioteket rikta in sig på .NET Standard 2.0. Inga nya versioner av .NET Standard släpps, men .NET 5 och alla senare versioner fortsätter att stödja .NET Standard 2.1 och tidigare.
Information om hur du väljer mellan .NET 5+ och .NET Standard finns i .NET 5+ och .NET Standard senare i den här artikeln.
.NET Standard-versioner
.NET Standard är versionshanterad. Varje ny version lägger till fler API:er. När ett bibliotek skapas mot en viss version av .NET Standard kan det köras på alla .NET-implementeringar som implementerar den versionen av .NET Standard (eller senare).
Med en högre version av .NET Standard kan ett bibliotek använda fler API:er, men det innebär att det bara kan användas i nyare versioner av .NET. Att rikta in sig på en lägre version minskar de tillgängliga API:erna, men innebär att biblioteket kan köras på fler platser.
Välj .NET Standard-version
.NET Standard 1.0 har 7 949 av de 37 118 tillgängliga API:erna.
.NET-implementering | Versionsstöd |
---|---|
.NET och .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 |
Universell Windows-plattform | 8.0, 8.1, 10.0, 10.0.16299, TBD |
Unity | 2018.1 |
Mer information finns i .NET Standard 1.0. En interaktiv tabell finns i .NET Standard-versioner.
Vilken .NET Standard-version som ska riktas
Om du riktar in dig på .NET Standard rekommenderar vi att du riktar in dig på .NET Standard 2.0, såvida du inte behöver ha stöd för en tidigare version. De flesta allmänna bibliotek bör inte behöva API:er utanför .NET Standard 2.0 och .NET Framework stöder inte .NET Standard 2.1. .NET Standard 2.0 stöds av alla moderna plattformar och är det rekommenderade sättet att stödja flera plattformar med ett mål.
Om du behöver stöd för .NET Standard 1.x rekommenderar vi att du även riktar in dig på .NET Standard 2.0. .NET Standard 1.x distribueras som en detaljerad uppsättning NuGet-paket, vilket skapar ett stort paketberoendediagram och resulterar i att många paket laddas ned när projektet skapas. Mer information finns i Plattformsoberoende mål och .NET 5+ och .NET Standard senare i den här artikeln.
Kommentar
Från och med .NET 9 genereras en byggvarning om projektet är avsett för .NET Standard 1.x. Mer information finns i Varning som genereras för .NET Standard 1.x-mål.
.NET Standard-versionsregler
Det finns två primära versionsregler:
- Additiv: .NET Standard-versioner är logiskt koncentriska cirklar: högre versioner innehåller alla API:er från tidigare versioner. Det finns inga icke-bakåtkompatibla ändringar mellan versioner.
- Oföränderlig: När .NET Standard-versionerna har levererats är de låsta.
Det kommer inte att finnas några nya .NET Standard-versioner efter 2.1. Mer information finns i .NET 5+ och .NET Standard senare i den här artikeln.
Specifikation
.NET Standard-specifikationen är en standardiserad uppsättning API:er. Specifikationen underhålls av .NET-implementerare, särskilt Microsoft (inklusive .NET Framework, .NET Core och Mono) och Unity.
Officiella artefakter
Den officiella specifikationen är en uppsättning .cs filer som definierar de API:er som ingår i standarden. Ref-katalogen i (nu arkiverad) dotnet/standardlagringsplatsen definierar .NET Standard API:er.
NetStandard.Library-metapackage (källa) beskriver den uppsättning bibliotek som definierar (delvis) en eller flera .NET Standard-versioner.
En viss komponent, till exempel System.Runtime
, beskriver:
- En del av .NET Standard (bara dess omfång).
- Flera versioner av .NET Standard för det omfånget.
Härledda artefakter tillhandahålls för att möjliggöra bekvämare läsning och för att aktivera vissa utvecklarscenarier (till exempel med hjälp av en kompilator).
- API-lista i markdown.
- Referenssammansättningar, distribuerade som NuGet-paket och refereras av NETStandard.Library metapackage.
Paketrepresentation
Det primära distributionsfordonet för .NET Standard-referenssammansättningar är NuGet-paket. Implementeringar levereras på olika sätt, lämpliga för varje .NET-implementering.
NuGet-paket riktar in sig på ett eller flera ramverk. .NET Standard-paket riktar in sig på ramverket ".NET Standard". Du kan rikta in dig på .NET Standard-ramverket netstandard
med hjälp av det kompakta målramverkets moniker (TFM), till exempel netstandard1.4
. Bibliotek som är avsedda att köras på flera implementeringar av .NET bör vara inriktade på .NET Standard-ramverket. För den bredaste uppsättningen API:er, mål netstandard2.0
, eftersom antalet tillgängliga API:er mer än fördubblades mellan .NET Standard 1.6 och 2.0.
Metapaketet NETStandard.Library
refererar till den fullständiga uppsättningen NuGet-paket som definierar .NET Standard. Det vanligaste sättet att rikta in sig netstandard
på är genom att referera till det här metapaketet. Den beskriver och ger åtkomst till de ~40 .NET-bibliotek och associerade API:er som definierar .NET Standard. Du kan referera till ytterligare paket som är avsedda netstandard
för att få åtkomst till ytterligare API:er.
Versionshantering
Specifikationen är inte singular, utan en linjärt versionerad uppsättning API:er. Den första versionen av standarden upprättar en baslinjeuppsättning med API:er. Efterföljande versioner lägger till API:er och ärver API:er som definierats av tidigare versioner. Det finns ingen etablerad etablering för att ta bort API:er från standarden.
.NET Standard är inte specifikt för någon .NET-implementering och matchar inte heller versionsschemat för någon av dessa implementeringar.
Som tidigare nämnts kommer det inte att finnas några nya .NET Standard-versioner efter 2.1.
Mål .NET Standard
Du kan skapa .NET Standard Libraries med hjälp av en kombination av ramverket netstandard
och NETStandard.Library
metapaketet.
.NET Framework-kompatibilitetsläge
Från och med .NET Standard 2.0 introducerades .NET Framework-kompatibilitetsläget. Med det här kompatibilitetsläget kan .NET Standard-projekt referera till .NET Framework-bibliotek som om de kompilerats för .NET Standard. Att referera till .NET Framework-bibliotek fungerar inte för alla projekt, till exempel bibliotek som använder API:er för Windows Presentation Foundation (WPF).
Mer information finns i .NET Framework-kompatibilitetsläge.
.NET Standard-bibliotek och Visual Studio
Om du vill skapa .NET Standard-bibliotek i Visual Studio måste du ha Visual Studio 2022, Visual Studio 2019 eller Visual Studio 2017 version 15.3 eller senare installerat i Windows.
Om du bara behöver använda .NET Standard 2.0-bibliotek i dina projekt kan du också göra det i Visual Studio 2015. Du behöver dock NuGet-klienten 3.6 eller senare installerad. Du kan ladda ned NuGet-klienten för Visual Studio 2015 från nedladdningssidan för NuGet.
.NET 5+ och .NET Standard
.NET 5, .NET 6, .NET 7, .NET 8 och .NET 9 är enskilda produkter med en enhetlig uppsättning funktioner och API:er som kan användas för Windows-skrivbordsappar och plattformsoberoende konsolappar, molntjänster och webbplatser. .NET 8 TFM:er återspeglar till exempel det här breda utbudet av scenarier:
net8.0
Den här TFM:en är avsedd för kod som körs överallt. Med några få undantag innehåller den endast tekniker som fungerar plattformsoberoende. För .NET 8-kod
net8.0
ersätter bådenetcoreapp
ochnetstandard
TFM:er.net8.0-windows
Det här är ett exempel på en OS-specifik TFM som lägger till OS-specifika funktioner till allt som
net8.0
refererar till.
När du ska rikta mot net8.0
mål netstandard
För befintlig kod som riktar sig mot .NET Standard 2.0 eller senare behöver du inte ändra TFM till net8.0
eller senare TFM. .NET 8 implementerar .NET Standard 2.1 och tidigare. Den enda anledningen till att ommåla från .NET Standard till .NET 8+ skulle vara att få åtkomst till fler körningsfunktioner, språkfunktioner eller API:er. Om du till exempel vill använda C# 9 måste du rikta in dig på .NET 5 eller en senare version. Du kan multitarget .NET 8 och .NET Standard för att få åtkomst till nyare funktioner och fortfarande ha biblioteket tillgängligt för andra .NET-implementeringar.
Kommentar
Om projektet är avsett för .NET Standard 1.x rekommenderar vi att du gör om det till .NET Standard 2.0 eller .NET 6+. Mer information finns i Varning som genereras för .NET Standard 1.x-mål.
Här följer några riktlinjer för ny kod för .NET 5+:
Appkomponenter
Om du använder bibliotek för att dela upp ett program i flera komponenter rekommenderar vi att du riktar in dig på
net8.0
. För enkelhetens skull är det bäst att behålla alla projekt som utgör ditt program på samma version av .NET. Sedan kan du anta samma BCL-funktioner överallt.Återanvändbara bibliotek
Om du skapar återanvändbara bibliotek som du planerar att skicka på NuGet bör du överväga kompromissen mellan räckvidd och tillgänglig funktionsuppsättning. .NET Standard 2.0 är den senaste versionen som stöds av .NET Framework, så den ger bra räckvidd med en ganska stor funktionsuppsättning. Vi rekommenderar inte att du riktar in dig på .NET Standard 1.x eftersom du begränsar den tillgängliga funktionsuppsättningen för en minimal ökning av räckvidden.
Om du inte behöver stöd för .NET Framework kan du rikta in dig på .NET Standard 2.1 eller .NET 8. Vi rekommenderar att du hoppar över .NET Standard 2.1 och går direkt till .NET 8. De mest använda biblioteken har flera mål för både .NET Standard 2.0 och .NET 5+. Stöd för .NET Standard 2.0 ger dig mest räckvidd, samtidigt som du stöder .NET 5+ ser till att du kan utnyttja de senaste plattformsfunktionerna för kunder som redan finns på .NET 5+.
.NET Standard-problem
Här följer några problem med .NET Standard som förklarar varför .NET 5 och senare versioner är det bättre sättet att dela kod mellan plattformar och arbetsbelastningar:
Långsamhet för att lägga till nya API:er
.NET Standard skapades som en API-uppsättning som alla .NET-implementeringar måste stödja, så det fanns en granskningsprocess för förslag för att lägga till nya API:er. Målet var att endast standardisera API:er som kunde implementeras på alla aktuella och framtida .NET-plattformar. Resultatet blev att om en funktion missade en viss version kan du behöva vänta ett par år innan den lades till i en version av Standard. Sedan väntar du ännu längre på att den nya versionen av .NET Standard ska få brett stöd.
Lösning i .NET 5+: När en funktion implementeras är den redan tillgänglig för varje .NET 5+-app och -bibliotek eftersom kodbasen delas. Och eftersom det inte finns någon skillnad mellan API-specifikationen och dess implementering kan du dra nytta av nya funktioner mycket snabbare än med .NET Standard.
Komplex versionshantering
Separationen av API-specifikationen från implementeringarna resulterar i komplex mappning mellan API-specifikationsversioner och implementeringsversioner. Den här komplexiteten visas i tabellen som visades tidigare i den här artikeln och instruktionerna för hur du tolkar den.
Lösning i .NET 5+: Det finns ingen separation mellan en .NET 5+ API-specifikation och dess implementering. Resultatet är ett förenklat TFM-schema. Det finns ett TFM-prefix för alla arbetsbelastningar:
net8.0
används för bibliotek, konsolappar och webbappar. Den enda varianten är ett suffix som anger plattformsspecifika API:er för en viss plattform, till exempelnet8.0-windows
. Tack vare den här TFM-namngivningskonventionen kan du enkelt se om en viss app kan använda ett visst bibliotek. Ingen tabell med versionsnummermotsvarigheter, som den för .NET Standard, behövs.Undantag som inte stöds på plattformen vid körning
.NET Standard exponerar plattformsspecifika API:er. Koden kan kompileras utan fel och verkar vara portabel för alla plattformar även om den inte är portabel. När den körs på en plattform som inte har någon implementering för ett visst API får du körningsfel.
Lösning i .NET 5+: .NET 5+ SDK:er innehåller kodanalysverktyg som är aktiverade som standard. Analysverktyget för plattformskompatibilitet identifierar oavsiktlig användning av API:er som inte stöds på de plattformar som du tänker köra på. Mer information finns i Analys av plattformskompatibilitet.
.NET Standard är inte inaktuell
.NET Standard behövs fortfarande för bibliotek som kan användas av flera .NET-implementeringar. Vi rekommenderar att du riktar in dig på .NET Standard i följande scenarier:
- Använd
netstandard2.0
för att dela kod mellan .NET Framework och alla andra implementeringar av .NET. - Använd
netstandard2.1
för att dela kod mellan Mono, Xamarin och .NET Core 3.x.