.NET Standard
A .NET Standard a .NET API-k formális 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 egységesebb legyen a .NET-ökoszisztéma. A .NET 5-ös és újabb verziói 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 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 és az összes későbbi 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, .NET 5+ és .NET Standard verzióiban olvashat.
.NET Standard verziók
A .NET Standard verziószámú. 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 .NET-implementáción futtatható, amely a .NET Standard (vagy újabb) verzióját implementálja.
A .NET Standard magasabb szintű 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 a 37 118 elérhető API-ból 7 949-et kíná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 |
.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 |
Universal 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 tekintse meg a .NET Standard verzióit.
Melyik .NET Standard verziót célozza meg
Ha a .NET Standardot célozza, 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, és .NET-keretrendszer nem támogatja a .NET Standard 2.1-et. A .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 egy célértékkel.
Ha támogatnia kell a .NET Standard 1.x-et, javasoljuk, hogy a .NET Standard 2.0-t is megcélozza. A .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ó: Platformfüggetlen célzás , .NET 5+ és .NET Standard a cikk későbbi részében.
Feljegyzés
A .NET 9-től kezdődően build figyelmeztetés jelenik meg, ha a projekt a .NET Standard 1.x-et célozza. További információt a .NET Standard 1.x-példányokra vonatkozó figyelmeztetésben talál.
.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 tartják fenn, különösen a Microsoft (beleértve a .NET-keretrendszer, a .NET Core és a Mono) és a Unityt.
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 (most archivált) dotnet/standard adattár ref könyvtára határozza meg a .NET Standard API-kat.
A NETStandard.Library metapackage (forrás) azokat a kódtárakat ismerteti, amelyek (részben) egy vagy több .NET Standard verziót definiálnak.
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 is elérhető a 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.
- API-lista a Markdownban.
- Referenciaszerelvények NuGet-csomagokként elosztva, és a NETStandard.Library metapackage hivatkozik rá.
Csomagábrázolás
A .NET Standard referenciaszerelvények elsődleges elosztójárműve a NuGet-csomagok. Az implementációk különböző módokon valósulnak meg, minden .NET-implementációhoz megfelelő módon.
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 kompakt cél keretrendszer moniker (TFM) használatával netstandard
célozhatja meg, netstandard1.4
például. 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 a .NET Standard 1.6 és 2.0 között.
A NETStandard.Library
metacsomag a .NET Standardot meghatározó 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 .NET Standardot meghatározó ~40 .NET-kódtárakhoz és társított API-khoz. 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.
A .NET Standard nem egyetlen .NET-implementációra jellemző, és nem felel meg az implementációk 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é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 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ód.
.NET Standard kódtárak és Visual Studio
A .NET Standard kódtárak Visual Studióban való létrehozásához győződjön meg arról, hogy a Visual Studio 2022, a Visual Studio 2019 vagy a Visual Studio 2017 15.3-s vagy újabb verziója telepítve van Windows rendszeren.
Ha csak .NET Standard 2.0 kódtárakat kell használnia a projektjeiben, ezt a Visual Studio 2015-ben is megteheti. Azonban a NuGet-ügyfél 3.6-os vagy újabb verziójára van szükség. A NuGet-ügyfél a Visual Studio 2015-höz a NuGet letöltési oldaláról tölthető le.
.NET 5+ és .NET Standard
A .NET 5, a .NET 6, a .NET 7, a .NET 8 és a .NET 9 egyetlen termék, amely egységes képességekkel és API-kkal rendelkezik, amelyek windowsos asztali alkalmazásokhoz és platformfüggetlen konzolalkalmazásokhoz, felhőszolgáltatásokhoz és webhelyekhez használhatók. A .NET 8 TFM-ek például a forgatókönyvek széles skáláját tükrözik:
net8.0
Ez a TFM mindenhol futó kódhoz készült. Néhány kivételtől eltekintve csak olyan technológiákat tartalmaz, amelyek platformfüggetlenek. A .NET 8-kód
net8.0
esetében a TFM-eket ésnetstandard
a TFM-eket isnetcoreapp
lecseréli.net8.0-windows
Ez egy példa egy operációsrendszer-specifikus TFM-re , amely operációsrendszer-specifikus funkciókat ad hozzá minden olyan funkcióhoz, amelyre
net8.0
hivatkozik.
Mikor kell célba venni net8.0
vagy netstandard
A .NET Standard 2.0-s vagy újabb verzióját futtató meglévő kódok esetében nem kell a TFM-et vagy egy újabb TFM-et net8.0
módosítani. A .NET 8 a .NET Standard 2.1-et és korábbi verziót implementálja. A .NET Standardról a .NET 8+ verzióra való újratöltés egyetlen oka az lenne, ha több futtatókörnyezeti funkcióhoz, nyelvi funkcióhoz vagy API-hoz 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 8 és a .NET Standard többtarget használatával hozzáférhet az újabb funkciókhoz, és továbbra is rendelkezésre áll a kódtár más .NET-implementációk számára.
Feljegyzés
Ha a projekt a .NET Standard 1.x-et célozza meg, javasoljuk, hogy a .NET Standard 2.0 vagy a .NET 6+ verzióra helyezze újra. További információt a .NET Standard 1.x-példányokra vonatkozó figyelmeztetésben talál.
A .NET 5+ új kódjának néhány irányelve:
Alkalmazás-összetevők
Ha kódtárakat használ az alkalmazások több összetevőre való lebontásához, javasoljuk, hogy a célokat
net8.0
célozza meg. 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 kapcsolat és az elérhető funkciókészlet közötti kompromisszumot. A .NET Standard 2.0 a .NET-keretrendszer által támogatott legújabb verzió, így jó elérésű, meglehetősen nagy funkciókészlettel. Nem javasoljuk a .NET Standard 1.x célzását, mivel a rendelkezésre álló funkciókészletet minimálisan növelné.
Ha nem kell támogatnia a .NET-keretrendszer, a .NET Standard 2.1-et vagy a .NET 8-at célozhatja meg. Javasoljuk, hogy hagyja ki a .NET Standard 2.1-et, és lépjen egyenesen a .NET 8-ra. A leggyakrabban használt kódtárak több célként szolgálnak a .NET Standard 2.0 és a .NET 5+ rendszerhez is. A .NET Standard 2.0 támogatása a lehető legtöbbet nyújtja, a .NET 5+ támogatása pedig 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 Standardtal kapcsolatban, amelyek segítenek elmagyarázni, hogy miért a .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
A .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 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ó elmulasztott egy adott kiadást, előfordulhat, hogy várnia kell néhány évet, mielőtt hozzáadta volna a Standard egyik verziójához. Ezután még tovább kellene várnia, amíg a .NET Standard új verziója széles körben támogatott lesz.
Megoldás a .NET 5+-ban: Egy szolgáltatás implementálásakor már elérhető minden .NET 5+ alkalmazáshoz és kódtá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, az új funkciókat sokkal gyorsabban használhatja ki, mint a .NET Standard esetében.
Ö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 a .NET 5+-ban: Nincs különválasztás a .NET 5+ API-specifikáció és annak implementációja között. Az eredmény egy egyszerűsített TFM-séma. Az összes számítási feladathoz egyetlen TFM-előtag tartozik:
net8.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áulnet8.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. A .NET Standardhoz hasonló verziószámmal egyenértékű táblára nincs szükség.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 ú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+-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. Javasoljuk, hogy a .NET Standardot a következő forgatókönyvekben célozza meg:
- A kód megosztására használható
netstandard2.0
.NET-keretrendszer és a .NET összes többi implementációja között. - Kód
netstandard2.1
megosztása a Mono, a Xamarin és a .NET Core 3.x között.