.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.Runtime
a 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.
- API-lista a Markdownban.
- A NETStandard.Library metapackage által hivatkozott, NuGet-csomagokként elosztott referenciaszerelvények.
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 netstandard
kompakt 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 netstandard
NETStandard.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 ésnetstandard
a TFM-et isnetcoreapp
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ó netstandard
kó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.0
a-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
vagynet6.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áulnet5.0-windows
vagynet6.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.