.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

Vi rekommenderar 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. .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 utvecklare laddar ned många paket när de skapar. Mer information finns i Plattformsoberoende mål och .NET 5+ och .NET Standard senare i den här artikeln.

.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).

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 med hjälp av den netstandardkompakta TFM (till exempel netstandard1.4). Bibliotek som är avsedda att köras på flera implementeringar av .NET bör rikta in sig på det här ramverket. För den bredaste uppsättningen API:er är målet 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 på Windows eller Visual Studio för Mac version 7.1 eller senare installerat på macOS.

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 och .NET 8 ä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åde netcoreapp och netstandard 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 net8.0 jämfört med netstandard

För befintlig kod som är avsedd netstandardför behöver du inte ändra TFM till net8.0 eller en 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.

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 använda .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 kommer att ha 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 exempel net8.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.

Se även