.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
Universal 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 Presentation Foundation (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