.NET Standard

.NET Standard az .NET API-k hivatalos specifikációja, amelyek több .NET implementációban is elérhetők. A Standard .NET mögött az volt a motiváció, hogy egységesebb legyen a .NET ökoszisztémában. .NET 5-ös és újabb verziók eltérő megközelítést alkalmaznak az egységesség kialakításához, amely a legtöbb forgatókönyvben szükségtelenné teszi .NET Standard használatát. Ha azonban kódot szeretne megosztani .NET Keretrendszer és bármely más .NET-implementáció, például a .NET Core között, a kódtárnak .NET Standard 2.0-t kell céloznia. Nem jelennek meg a .NET Standard új verziói, de .NET 5 és az összes későbbi verzió továbbra is támogatja .NET Standard 2.1-et és korábbi verziót.

A .NET 5+ és .NET Standard közötti választásról a jelen cikk későbbi, .NET 5+ és .NET Standard című szakaszában olvashat.

.NET Standard verziók

.NET Standard verziójú. Minden új verzió további API-kat ad hozzá. Ha egy kódtár a .NET Standard egy bizonyos verziójára épül, akkor bármely olyan .NET implementáción futtatható, amely implementálja az .NET Standard (vagy újabb) verzióját.

A .NET Standard magasabb verziójának megcélzása lehetővé teszi, hogy a kódtár több API-t használjon, de azt jelenti, hogy csak a .NET újabb verzióiban használható. Az alacsonyabb verzió megcélzása csökkenti a rendelkezésre álló API-kat, de azt jelenti, hogy a kódtár több helyen is futtatható.

.NET Standard verzió kiválasztása

.NET Standard 1.0 7949-et kínál a 37 118 elérhető API-ból.

.NET implementáció Verziótámogatás
.NET és .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0
.NET-keretrendszer 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 (Ha szükséges, adjon hozzá leírási kontextust a "Mono" szóhoz, ha az például orvosi vagy technológiai jelentéssel bír.) 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
Univerzális Windows-platform 8.0, 8.1, 10.0, 10.0.16299, Még nem meghatározott
Egység 2018.1

További információ: .NET Standard 1.0. Interaktív táblázatért lásd: .NET Standard verziók.

Melyik .NET Standard verziót célozzuk meg

Ha .NET Standardot céloz meg, javasoljuk, hogy .NET Standard 2.0-t célozzon meg, hacsak nem kell támogatnia egy korábbi verziót. A legtöbb általános célú kódtárnak nem kell .NET Standard 2.0-n kívüli API-kra, és .NET Keretrendszer nem támogatja .NET Standard 2.1-et. .NET Standard 2.0-t minden modern platform támogatja, és ez az ajánlott módja annak, hogy több platformot is támogatjon egyetlen célként.

Ha támogatnia kell a .NET Standard 1.x-et, javasoljuk, hogy a .NET Standard 2.0-t is célozza meg. .NET Standard 1.x a NuGet-csomagok részletes készleteként van elosztva, amely egy nagy csomagfüggőségi gráfot hoz létre, és a projekt létrehozásakor sok csomagot tölt le. További információ: Cross-platform targeting és .NET 5+ és .NET Standard a cikk későbbi részében.

Megjegyzés

.NET 9-től kezdve a rendszer figyelmeztetést ad ki a build során, ha a projekt a .NET Standard 1.x-et célozza meg. További információ: Az .NET Standard 1.x-célokhoz kibocsátott figyelmeztetés.

.NET Standard verziószámozási szabályok

Két elsődleges verziószámozási szabály létezik:

  • Additív: .NET A standard verziók logikailag koncentrikus körök: a magasabb verziók a korábbi verziók összes API-ját tartalmazzák. A verziók között nincsenek kompatibilitástörő változások.
  • Nem módosítható: A szállítás után .NET Standard verziók le vannak fagyasztva.

A 2.1 után nem lesznek új .NET Standard verziók. További információ: .NET 5+ és .NET Standard a cikk későbbi részében.

Specifikáció

A .NET Standard specifikáció az API-k szabványosított készlete. A specifikációt a .NET megvalósítók tartják karban, kifejezetten a Microsoft (beleértve a .NET Framework-t, a .NET Core-t és a Mono-t) és a Unity-t.

Hivatalos artefaktumok

A hivatalos specifikáció .cs fájlok készlete, amelyek meghatározzák a szabvány részét képező API-kat. A ref könyvtár a (most archivált) dotnet/standard adattárban határozza meg a .NET Standard API-kat.

A NETStandard.Library metapackage (source) azokat a kódtárakat ismerteti, amelyek (részben) egy vagy több .NET Standard verziót határoznak meg.

Egy adott összetevő, például System.Runtimea következőt írja le:

  • A .NET Standard része (csak a hatóköre).
  • A .NET Standard több verziója az adott hatókörhöz.

A származékos összetevők a kényelmesebb olvasás és bizonyos fejlesztői forgatókönyvek (például fordító használata) engedélyezéséhez érhetők el.

Csomagábrázolás

A .NET Standard referenciakönyvtárak elsődleges elosztási módszere a NuGet-csomagok. A megvalósítások különböző módokon valósulnak meg, az egyes .NET implementációknak megfelelően.

A NuGet-csomagok egy vagy több keretrendszert céloznak meg. .NET Standard csomagok a ".NET Standard" keretrendszert célozzák. A .NET Standard keretrendszert a netstandardcompact target framework moniker (TFM), például netstandard1.4 használatával célozhatja meg. A .NET több implementációján futtatandó kódtáraknak a .NET Standard keretrendszerre kell irányulnia. Az API-k legszélesebb halmaza esetében a cél netstandard2.0, mivel a rendelkezésre álló API-k száma több mint kétszeresére nőtt .NET Standard 1.6 és 2.0 között.

A NETStandard.Library metapackage a Standard .NET definiáló NuGet-csomagok teljes készletére hivatkozik. A leggyakoribb módszer netstandard célzására ennek a metacsomagnak a hivatkozásával történik. Ismerteti és hozzáférést biztosít az .NET Standardot definiáló ~40 .NET kódtárhoz és társított API-hoz. További, célként kitűzött netstandard csomagokra hivatkozva további API-khoz is hozzáférhet.

Verziókezelés

A specifikáció nem egyedi, hanem lineárisan verziózott API-k készlete. A szabvány első verziója létrehozza az API-k alapkonfigurációját. A következő verziók api-kat adnak hozzá, és öröklik az előző verziók által definiált API-kat. Az API-k standardból való eltávolítására nincs megállapított rendelkezés.

.NET A Standard nem egyetlen .NET implementációra jellemző, és nem felel meg egyik implementáció verziószámozási sémájának sem.

Ahogy korábban említettük, a 2.1 után nem lesznek új .NET Standard verziók.

Célozza meg a .NET Standardot

A .NET Standard könyvtárakat a netstandard keretrendszer és a NETStandard.Library metacsomag kombinációjával hozhat létre.

.NET keretrendszer kompatibilitási módja

A .NET Standard 2.0-tól kezdve bevezettük a .NET-keretrendszer kompatibilitási módját. Ez a kompatibilitási mód lehetővé teszi, hogy .NET Standard-projektek .NET Keretrendszer-kódtárakra hivatkozzon, mintha .NET Standardhoz lettek volna lefordítva. A .NET keretrendszerkódtárakra való hivatkozás nem minden projektnél működik, például a Windows megjelenítési alaprendszer (WPF) API-kat használó kódtáraknál.

További információ: .NET Keretrendszer kompatibilitási módja.

.NET Standard kódtárak és Visual Studio

Ha .NET Standard kódtárakat szeretne létrehozni Visual Studio, győződjön meg arról, hogy a Visual Studio 2019-es vagy újabb verzió vagy Visual Studio 2017 15.3-s vagy újabb verziója telepítve van Windows.

Ha csak .NET Standard 2.0 kódtárakat kell használnia a projektjeiben, ezt a 2015-ös Visual Studio is megteheti. Azonban a NuGet-ügyfél 3.6-os vagy újabb verziójára van szükség. A 2015-ös Visual Studio NuGet-ügyfelet a NuGet-letöltések oldalról töltheti le.

.NET 5+ és .NET Standard

.NET 5, .NET 6, .NET 7, .NET 8, .NET 9 és .NET 10 egyetlen termék, amely egységes képességekkel és API-kkal rendelkezik, amelyek Windows asztali alkalmazásokhoz, platformfüggetlen konzolalkalmazásokhoz, felhőszolgáltatásokhoz és webhelyekhez használhatók. A .NET 10 TFM például a forgatókönyvek széles skáláját tükrözi:

  • net10.0

    Ez a TFM olyan kódhoz készült, amely mindenhol fut. Néhány kivételtől eltekintve csak olyan technológiákat tartalmaz, amelyek platformfüggetlenek.

  • net10.0-windows

    Ez egy olyan operációsrendszer-specifikus TFM- példa, amely operációsrendszer-specifikus funkciókat ad hozzá minden olyan funkcióhoz, amelyre net10.0 hivatkozik.

Mikor kell célba venni netx.0 vagy netstandard

Az .NET Standard 2.0-s vagy újabb verziót futtató meglévő kódok esetében nem kell a TFM-et net8.0 vagy újabb TFM-re módosítani. .NET 8, .NET 9 és .NET 10 implementálja .NET Standard 2.1 és korábbi verziót. Az egyetlen ok a .NET Standardról a .NET 8+-ra történő átirányításra az lenne, hogy hozzáférjünk több futtatókörnyezeti funkcióhoz, nyelvi funkcióhoz vagy API-hoz. A C# 9 használatához például .NET 5-ös vagy újabb verziót kell használnia. A .NET és a .NET Standard többcélú célzásával hozzáférhet az új funkciókhoz, miközben a könyvtára elérhető marad más .NET implementációk számára.

Megjegyzés

Ha a projekt .NET Standard 1.x-re irányul, javasoljuk, hogy célozza újra .NET Standard 2.0-ra vagy .NET 8+-ra. További információ: Az .NET Standard 1.x-célokhoz kibocsátott figyelmeztetés.

Az 5+.NET új kódjának néhány irányelve:

  • Alkalmazás-összetevők

    Javasoljuk, hogy ha kódtárakat használ az alkalmazás több összetevőre való lebontásához, akkor a net10.0-t célozza meg. Az egyszerűség kedvéért a legjobb, ha az alkalmazást alkotó összes projektet az .NET ugyanazon verzióján tartja. Ezután mindenhol ugyanazokat a BCL-funkciókat feltételezheti.

  • Újrafelhasználható kódtárak

    Ha olyan újrafelhasználható kódtárakat hoz létre, amelyeket a NuGeten szeretne szállítani, fontolja meg a kapcsolat és az elérhető funkciókészlet közötti kompromisszumot. .NET Standard 2.0 a .NET Framework által támogatott legújabb verzió, így elég nagy funkciókészlettel érhető el. Nem javasoljuk a .NET Standard 1.x célzását, mivel ezzel korlátozná a rendelkezésre álló funkciókészletet, és csak minimális elérést növelne.

    Ha nem kell támogatnia .NET Keretrendszert, .NET Standard 2.1-et vagy .NET 10-et célozhat meg. Javasoljuk, hogy hagyja ki a .NET Standard 2.1-et, és lépjen egyenesen a .NET 10-be. A leggyakrabban használt könyvtárak több platformot céloznak meg .NET Standard 2.0 és .NET 5+ esetében. A .NET Standard 2.0 támogatása a lehető legtöbb elérést biztosítja, miközben a .NET 5+ támogatása garantálja, hogy a legújabb platformfunkciókat is kihasználhassa azoknál az ügyfeleknél, akik már a .NET 5+ verziót használják.

.NET Standard problémák

Íme néhány probléma a .NET Standardtal kapcsolatban, amelyek segítenek elmagyarázni, hogy miért .NET 5-ös és újabb verziók a jobb módszer a kódok platformok és számítási feladatok közötti megosztására:

  • Új API-k hozzáadásának lassúsága

    .NET Standard olyan API-készletként lett létrehozva, amelyet minden .NET implementációnak támogatnia kell, ezért felülvizsgálati folyamat indult az új API-k hozzáadására vonatkozó javaslatokhoz. A cél csak az összes jelenlegi és jövőbeli .NET platformon implementálható API-k szabványosítása volt. Az eredmény az volt, hogy ha egy funkció kimaradt egy adott kiadásból, előfordulhat, hogy várhat néhány évet, mielőtt hozzáadták volna a Standard egy verziójához. Ezután még tovább várhat, amíg a .NET Standard új verziója széles körben támogatott lesz.

    .NET 5+ megoldás: Egy funkció implementálásakor az már elérhető minden .NET 5+ alkalmazáshoz és könyvtárhoz, mert a kódbázis meg van osztva. Mivel az API specifikációja és implementációja között nincs különbség, sokkal gyorsabban használhatja ki az új funkciókat, mint a standard .NET.

  • Összetett verziószámozás

    Az API-specifikációnak a implementációktól való elkülönítése összetett leképezést eredményez az API-specifikációk verziói és a megvalósítási verziók között. Ez az összetettség nyilvánvaló a cikkben korábban bemutatott táblázatban és az értelmezésre vonatkozó utasításokban.

    Megoldás .NET 5+ esetén: A .NET 5+ API specifikációja és implementációja között nincs különválasztás. Az eredmény egy egyszerűsített TFM-séma. Az összes számítási feladathoz egyetlen TFM-előtag tartozik: net10.0 kódtárakhoz, konzolalkalmazásokhoz és webalkalmazásokhoz használatos. Az egyetlen változat egy utótag, amely egy adott platform platformspecifikus API-jait adja meg, például net10.0-windows. Ennek a TFM-elnevezési konvenciónak köszönhetően könnyen megállapíthatja, hogy egy adott alkalmazás használhat-e egy adott kódtárat. Nincs szükség verziószámmal egyenértékű táblára, például a .NET Standard táblára.

  • Platform által nem támogatott kivételek futásidőben

    .NET Standard platformspecifikus API-kat tesz elérhetővé. Előfordulhat, hogy a kód hiba nélkül lefordítható, és úgy tűnik, hogy bármilyen platformon hordozható, még akkor is, ha nem hordozható. Ha olyan platformon fut, amely nem rendelkezik implementációval egy adott API-hoz, futásidejű hibákat fog kapni.

    Megoldás a .NET 5+: Az .NET 5+ SDK-k alapértelmezés szerint engedélyezett kódelemzőket tartalmaznak. A platformkompatibilitás-elemző észleli a futtatni kívánt platformokon nem támogatott API-k véletlen használatát. További információ: Platformkompatibilitás-elemző.

.NET Standard nem elavult

.NET Standardra továbbra is szükség van a több .NET implementáció által használható kódtárakhoz. A .NET Standardot a következő forgatókönyvekben javasoljuk:

  • A netstandard2.0 használatával kódot oszthat meg a .NET-keretrendszer és a .NET minden egyéb implementációja között.
  • A netstandard2.1 használatával kódot oszthat meg a Mono és .NET Core 3.x között.

Lásd még