.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

Javasoljuk, hogy a .NET Standard 2.0-t célozza meg, kivéve, ha támogatnia kell egy korábbi verziót. A legtöbb általános célú kódtárnak nem szabad a .NET Standard 2.0-n kívüli API-kat igényelnie. 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 fejlesztők sok csomagot töltenek le az összeállítás során. További információ: Platformfüggetlen célzás , .NET 5+ és .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 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.Runtimea 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.

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 megcélozhatja a netstandardkompakt TFM használatával (például netstandard1.4). A .NET több implementációján futtatandó kódtáraknak ezt a keretrendszert kell céloznia. A legszélesebb API-k esetében a cél netstandard2.0 , mivel a rendelkezésre álló API-k száma több mint duplájára nőtt az .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 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 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

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-s vagy újabb verziója telepítve van Windows rendszeren, vagy a Mac Visual Studio 7.1-es vagy újabb verziója macOS 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 és a .NET 8 egyetlen termék, amely egységes képességekkel és API-kkal rendelkezik, amelyek windowsos asztali alkalmazásokhoz, 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 és netstandard a TFM-eket is netcoreapp 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 cél net8.0 vs. netstandard

Meglévő, célként szolgáló netstandardkód esetén nem kell a TFM-et vagy egy későbbi 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.

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.0cé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 használhatja. 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 a .NET Standard 2.0 és a .NET 5+ esetében is több célt szolgálnak. 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ául net8.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.

Lásd még