.NET Standard

A .NET Standard a .NET API-k hivatalos specifikációja, amelyek több .NET-implementációban is elérhetők. A .NET Standard mögött az volt a motiváció, hogy nagyobb egységességet teremtsen a .NET-ökoszisztémában. A .NET 5-ös és újabb verziói eltérő megközelítést alkalmaznak az egységesség kialakítására, amely a legtöbb esetben nem igényli a .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 a .NET Standard 2.0-t kell céloznia. A .NET Standard új verziói nem jelennek meg, de a .NET 5, a .NET 6 és az összes jövőbeli verzió továbbra is támogatja a .NET Standard 2.1-et és korábbi verzióit.

A .NET 5+ és a .NET Standard közötti választásról a cikk későbbi részében található .NET 5+ és .NET Standard című témakörben olvashat.

.NET Standard verziók

A .NET Standard verziószámozott. 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ármilyen .NET-implementáción futtatható, amely a .NET Standard (vagy újabb) ezen verzióját implementálja.

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

A .NET Standard verzió kiválasztása

A .NET Standard 1.0 7949-et biztosít 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
.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 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, TBD
Unity 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élozza meg

Javasoljuk, hogy a .NET Standard 2.0-t célozza meg, hacsak nem kell támogatnia egy korábbi verziót. A legtöbb általános célú kódtárnak nem kell a .NET Standard 2.0-n kívüli API-kra szüksége. A .NET Standard 2.0-t minden modern platform támogatja, és ez a javasolt módszer több platform egyetlen célhoz való támogatásához.

Ha támogatnia kell a .NET Standard 1.x-et, javasoljuk, hogy a .NET Standard 2.0-t is célozza. A .NET Standard 1.x NuGet-csomagok részletes készleteként van elosztva, ami egy nagy csomagfüggőségi gráfot hoz létre, és azt eredményezi, hogy a fejlesztők sok csomagot töltenek le az összeállítás során. További információ: A platformfüggetlen célzás és a .NET 5+ és a .NET Standard a cikk későbbi részében.

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

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

  • Additív: A .NET 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 a .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-implementátorok, különösen a Microsoft (beleértve a .NET-keretrendszer, a .NET Core és a Mono) és a Unity kezelik.

Hivatalos összetevők

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

A NETStandard.Library metacsomag (forrás) egy vagy több .NET Standard-verziót (részben) definiáló kódtárakat ismerteti.

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őket a kényelmesebb olvasás és bizonyos fejlesztői forgatókönyvek (például fordító használata) lehetővé tétele érdekében biztosítjuk.

Csomagábrázolás

A .NET Standard referenciaszerelvények elsődleges disztribúciós járműve a NuGet-csomagok. Az implementációk különböző módokon érhetők el, az egyes .NET-implementációknak megfelelően.

A NuGet-csomagok egy vagy több keretrendszert céloznak meg. A .NET Standard csomagok a ".NET Standard" keretrendszert célozzák. A .NET Standard keretrendszert a netstandardkompakt TFM használatával célozhatja meg (például netstandard1.4). A .NET több implementációján futtatandó kódtáraknak ezt a keretrendszert kell céloznia. A legtágabb API-k esetében a cél netstandard2.0 , mivel az elérhető API-k száma több mint kétszeresére nőtt a .NET Standard 1.6 és 2.0 között.

A NETStandard.Library metacsomag a .NET Standardot definiáló NuGet-csomagok teljes készletére hivatkozik. A célzás netstandard leggyakoribb módja ennek a metacsomagnak a hivatkozása. Ismerteti és hozzáférést biztosít a ~40 .NET-kódtárhoz és a .NET Standardot definiáló társított API-khoz. További csomagokra is hivatkozhat, amelyek további API-khoz való hozzáférést céloznak netstandard meg.

Verziókezelés

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

A .NET 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-et követően nem lesznek új .NET Standard verziók.

Cél .NET Standard

A .NET Standard kódtárakat a keretrendszer és a netstandardNETStandard.Library metapackage kombinációjával hozhatja létre.

.NET-keretrendszer kompatibilitási mód

A .NET Standard 2.0-tól kezdve bevezettük a .NET-keretrendszer kompatibilitási módot. Ezzel a kompatibilitási móddal a .NET Standard-projektek úgy hivatkozhatnak .NET-keretrendszer kódtárakra, mintha a .NET Standardhoz lettek volna lefordítva. A .NET-keretrendszer kódtárakra való hivatkozás nem működik minden projektnél, 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ód.

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

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

Ha csak .NET Standard 2.0 kódtárakat kell használnia a projektjeiben, ezt a Visual Studio 2015-ben is megteheti. A NuGet-ügyfél 3.6-os vagy újabb verziójára azonban telepítve kell lennie. A Visual Studio 2015 NuGet-ügyfelet a NuGet letöltési oldaláról töltheti le.

.NET 5+ és .NET Standard

A .NET 5 és a .NET 6 egységes képességekkel és API-kkal rendelkező termékek, amelyek windowsos asztali alkalmazásokhoz, platformfüggetlen konzolalkalmazásokhoz, felhőszolgáltatásokhoz és webhelyekhez használhatók. A .NET 5 TFM-jei például a forgatókönyvek széles körét tükrözik:

  • net5.0

    Ez a TFM mindenhol futó kódhoz készült. Néhány kivételtől eltekintve csak a platformfüggetlen technológiákat tartalmazza. A .NET 5-kód net5.0 esetében a és netstandard a TFM-et is netcoreapp lecseréli.

  • net5.0-windows

    Ez egy olyan operációsrendszer-specifikus TFM-et mutat be, amely operációsrendszer-specifikus funkciókat ad hozzá minden olyan elemhez, amelyre net5.0 hivatkozik.

Mikor a net5.0 vagy a net6.0 vagy a netstandard

A meglévő, célként szolgáló netstandardkód esetében nem kell a TFM-et vagy net6.0-ra net5.0 módosítani. A .NET 5 és a .NET 6 a .NET Standard 2.1-et és korábbi verziót implementálja. A .NET Standard-ról a .NET 5+ verzióra való újratöltés egyetlen oka az lenne, ha további futtatókörnyezeti funkciókhoz, nyelvi funkciókhoz vagy API-khoz férne hozzá. A C# 9 használatához például meg kell céloznia a .NET 5-öt vagy egy újabb verziót. A .NET 5 vagy a .NET 6 és a .NET Standard többfunkciós verziójával hozzáférhet az újabb funkciókhoz, és továbbra is elérhetővé teheti a kódtárat más .NET-implementációk számára.

Íme néhány irányelv a .NET 5+-hoz készült új kódhoz:

  • Alkalmazás-összetevők

    Ha kódtárakat használ az alkalmazások több összetevőre való lebontásához, javasoljuk, hogy a vagy net6.0a-t célozza megnet5.0. Az egyszerűség kedvéért a legjobb, ha az alkalmazást alkotó összes projektet a .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 kapcsolatfelvétel és az elérhető funkciókészlet közötti kompromisszumot. A .NET Standard 2.0 a legújabb verzió, amelyet a .NET-keretrendszer támogat, így elég nagy funkciókészlettel rendelkezik. Nem javasoljuk a .NET Standard 1.x célzását, mivel az elérhető funkciókészletet minimálisan növelné.

    Ha nem kell támogatnia a .NET-keretrendszer, használhatja a .NET Standard 2.1-et vagy a .NET 5/6-ot. Javasoljuk, hogy hagyja ki a .NET Standard 2.1-et, és lépjen egyenesen a .NET 6-ra. A leggyakrabban használt kódtárak a .NET Standard 2.0-s és a .NET 5-ös vagy újabb verziókra is több célt szolgálnak. A .NET Standard 2.0 támogatása a lehető legtöbbet nyújtja, míg a .NET 5+ támogatása biztosítja, hogy a .NET 5+-on már elérhető ügyfelek számára is kihasználja a legújabb platformfunkciókat.

.NET Standard-problémák

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

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

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

    Megoldás a .NET 5+-ban: Ha egy funkció implementálva van, az már minden .NET 5+ alkalmazáshoz és kódtárhoz elérhető, mivel a kódbázis meg van osztva. Mivel az API-specifikáció és az implementáció között nincs különbség, az új funkciók sokkal gyorsabban kihasználhatók, mint a .NET Standard esetében.

  • Összetett verziószámozás

    Az API-specifikáció implementációktól való elkülönítése összetett leképezést eredményez az API-specifikációk verziói és az implementációs verziók között. Ez az összetettség nyilvánvaló a cikk korábbi részében bemutatott táblázatban és a értelmezésére vonatkozó utasításokban.

    Megoldás a .NET 5+-ban: A .NET 5+ API-specifikáció é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 egy TFM-előtag tartozik: net5.0 vagy net6.0 kódtárakhoz, konzolalkalmazásokhoz és webalkalmazásokhoz használatos. Az egyetlen változat egy utótag, amely platformspecifikus API-kat határoz meg egy adott platformhoz, például net5.0-windows vagy net6.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 Standardra.

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

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

    Megoldás a .NET 5+-ban: A .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ő.

A .NET Standard nem elavult

A .NET Standard továbbra is szükséges a több .NET-implementáció által használható kódtárakhoz. A .NET Standardot a következő esetekben javasoljuk:

  • A használatával netstandard2.0 kódot oszthat meg .NET-keretrendszer és a .NET összes többi implementációja között.
  • A használatával netstandard2.1 kódot oszthat meg a Mono, a Xamarin és a .NET Core 3.x között.

Lásd még