Sdílet prostřednictvím


.NET Standard

.NET Standard je formální specifikace rozhraní .NET API, která jsou k dispozici v několika implementacích .NET. Motivací za rozhraním .NET Standard bylo vytvořit větší jednotnost v ekosystému .NET. .NET 5 a novější verze používají jiný přístup k vytvoření jednotnosti, která eliminuje potřebu .NET Standard ve většině scénářů. Pokud ale chcete sdílet kód mezi rozhraním .NET Framework a jakoukoli jinou implementací .NET, jako je .NET Core, měla by vaše knihovna cílit na .NET Standard 2.0. Nebudou vydány žádné nové verze .NET Standard, ale .NET 5 a všechny novější verze budou nadále podporovat .NET Standard 2.1 a starší.

Informace o výběru mezi .NET 5+ a .NET Standard naleznete v části .NET 5+ a .NET Standard dále v tomto článku.

Verze .NET Standard

.NET Standard je verze. Každá nová verze přidává další rozhraní API. Pokud je knihovna postavena na určité verzi rozhraní .NET Standard, může běžet na jakékoli implementaci .NET, která implementuje tuto verzi .NET Standard (nebo vyšší).

Cílení na vyšší verzi .NET Standard umožňuje knihovně používat více rozhraní API, ale znamená to, že ji lze použít pouze v novějších verzích .NET. Cílení na nižší verzi snižuje dostupná rozhraní API, ale znamená to, že knihovna může běžet na více místech.

Výběr verze .NET Standard

.NET Standard 1.0 má 7 949 z 37 118 dostupných rozhraní API.

Implementace .NET Podpora verzí
.NET a .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
.NET Framework 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ální platforma Windows 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

Další informace najdete v tématu .NET Standard 1.0. Interaktivní tabulku najdete v tématu Verze .NET Standard.

Která verze .NET Standard se má cílit

Pokud cílíte na .NET Standard, doporučujeme, abyste cílili na .NET Standard 2.0, pokud nepotřebujete podporovat starší verzi. Většina knihoven pro obecné účely by neměla potřebovat rozhraní API mimo .NET Standard 2.0 a rozhraní .NET Framework nepodporuje rozhraní .NET Standard 2.1. .NET Standard 2.0 je podporován všemi moderními platformami a je doporučeným způsobem, jak podporovat více platforem s jedním cílem.

Pokud potřebujete podporovat .NET Standard 1.x, doporučujeme také cílit na .NET Standard 2.0. .NET Standard 1.x se distribuuje jako podrobná sada balíčků NuGet, která vytvoří rozsáhlý graf závislostí balíčků a při vytváření projektu se stahuje velké množství balíčků. Další informace najdete v tématu Cílení na různé platformy a .NET 5+ a .NET Standard dále v tomto článku.

Poznámka:

Od verze .NET 9 se vygeneruje upozornění sestavení, pokud projekt cílí na .NET Standard 1.x. Další informace naleznete v tématu Upozornění generované pro cíle .NET Standard 1.x.

Pravidla správy verzí .NET Standard

Existují dvě primární pravidla správy verzí:

  • Sčítání: Verze .NET Standard jsou logicky soustředné kruhy: vyšší verze zahrnují všechna rozhraní API z předchozích verzí. Mezi verzemi nejsou žádné zásadní změny.
  • Neměnné: Po odeslání se verze .NET Standard zablokují.

Po verzi 2.1 nebudou k dispozici žádné nové verze .NET Standard. Další informace najdete v tématu .NET 5+ a .NET Standard dále v tomto článku.

Specifikace

Specifikace .NET Standard je standardizovaná sada rozhraní API. Specifikaci udržují implementátoři .NET, konkrétně Microsoft (včetně rozhraní .NET Framework, .NET Core a Mono) a Unity.

Oficiální artefakty

Oficiální specifikace je sada .cs souborů, které definují rozhraní API, která jsou součástí standardu. Adresář ref v úložišti dotnet/standard (nyní archivovaný) definuje rozhraní API .NET Standard.

Metapackage netStandard.Library (zdroj) popisuje sadu knihoven, které definují (v části) jednu nebo více verzí .NET Standard.

Daná komponenta, například System.Runtime, popisuje:

  • Část rozhraní .NET Standard (pouze její obor)
  • Pro tento obor je k sadě .NET Standard více verzí.

K dispozici jsou odvozené artefakty, které umožňují pohodlnější čtení a umožňují určité vývojářské scénáře (například pomocí kompilátoru).

Reprezentace balíčku

Primárním distribučním vozidlem pro referenční sestavení .NET Standard jsou balíčky NuGet. Implementace se doručují různými způsoby, které jsou vhodné pro každou implementaci .NET.

Balíčky NuGet cílí na jednu nebo více architektur. Balíčky .NET Standard cílí na architekturu .NET Standard. Rozhraní .NET Standard můžete cílit například netstandard1.4pomocí monikeru kompaktního cílového netstandard rozhraní (TFM). Knihovny, které mají být spuštěny v několika implementacích rozhraní .NET, by měly cílit na rozhraní .NET Standard. Pro nejširší sadu rozhraní API cíl netstandard2.0, protože počet dostupných rozhraní API více než zdvojnásobil mezi .NET Standard 1.6 a 2.0.

Metapackage NETStandard.Library odkazuje na úplnou sadu balíčků NuGet, které definují .NET Standard. Nejběžnější způsob, jak cílit netstandard , je odkazování na tento metabalíč. Popisuje a poskytuje přístup ke knihovnám ~40 .NET a přidruženým rozhraním API, která definují .NET Standard. Můžete odkazovat na další balíčky, které cílí netstandard na získání přístupu k dalším rozhraním API.

Vytváření verzí

Specifikace není v jednotném čísle, ale lineární verze sady rozhraní API. První verze standardu vytvoří základní sadu rozhraní API. Další verze přidávají rozhraní API a dědí rozhraní API definovaná předchozími verzemi. Pro odebrání rozhraní API ze standardu neexistuje žádné zřízení.

.NET Standard není specifický pro žádnou implementaci .NET ani neodpovídá schématu správy verzí žádné z těchto implementací.

Jak jsme uvedli dříve, po verzi 2.1 nebudou k dispozici žádné nové verze .NET Standard.

Target .NET Standard

Knihovny .NET Standard můžete sestavit pomocí kombinace netstandard architektury a NETStandard.Library metabalíku.

Režim kompatibility rozhraní .NET Framework

Od verze .NET Standard 2.0 byl zaveden režim kompatibility rozhraní .NET Framework. Tento režim kompatibility umožňuje projektům .NET Standard odkazovat na knihovny rozhraní .NET Framework, jako by byly zkompilovány pro .NET Standard. Odkazování na knihovny rozhraní .NET Framework nefunguje pro všechny projekty, jako jsou knihovny, které používají rozhraní API služby Windows Presentation Foundation (WPF).

Další informace naleznete v tématu režim kompatibility rozhraní .NET Framework.

Knihovny .NET Standard a Visual Studio

Pokud chcete vytvářet knihovny .NET Standard v sadě Visual Studio, ujistěte se, že máte ve Windows nainstalovanou sadu Visual Studio 2022, Visual Studio 2019 nebo Visual Studio 2017 verze 15.3 nebo novější.

Pokud potřebujete ve svých projektech využívat pouze knihovny .NET Standard 2.0, můžete to udělat také v sadě Visual Studio 2015. Potřebujete však nainstalovaného klienta NuGet verze 3.6 nebo vyšší. Klienta NuGet pro Visual Studio 2015 si můžete stáhnout ze stránky pro stahování NuGet.

.NET 5+ a .NET Standard

.NET 5, .NET 6, .NET 7, .NET 8 a .NET 9 jsou jediné produkty s jednotnou sadou funkcí a rozhraní API, které lze použít pro desktopové aplikace Windows a multiplatformní konzolové aplikace, cloudové služby a weby. TfM .NET 9 například odrážejí tuto širokou škálu scénářů:

  • net9.0

    Tento TFM je určený pro kód, který běží všude. S několika výjimkami zahrnuje pouze technologie, které fungují napříč platformami. Pro kód net9.0 .NET 9 nahradí oba netcoreapp i netstandard TFM.

  • net9.0-windows

    Toto je příklad TFM specifického pro operační systém, který přidává funkce specifické pro operační systém ke všemu, na co net9.0 odkazuje.

Kdy cílit netx.0 vs. netstandard

Pro stávající kód, který cílí na .NET Standard 2.0 nebo novější, není nutné měnit TFM na net8.0 TFM nebo novější TFM. .NET 8 a .NET 9 implementují .NET Standard 2.1 a starší. Jediným důvodem k opětovnému cílení z .NET Standard na .NET 8 nebo novější je získání přístupu k více funkcím modulu runtime, jazykových funkcím nebo rozhraním API. Pokud například chcete použít C# 9, musíte cílit na .NET 5 nebo novější verzi. Pokud chcete získat přístup k novějším funkcím a mít knihovnu k dispozici pro další implementace .NET, můžete použít multitarget .NET a .NET Standard.

Poznámka:

Pokud váš projekt cílí na .NET Standard 1.x, doporučujeme ho změnit na .NET Standard 2.0 nebo .NET 8 nebo novější. Další informace naleznete v tématu Upozornění generované pro cíle .NET Standard 1.x.

Tady jsou některé pokyny pro nový kód pro .NET 5+:

  • Komponenty aplikace

    Pokud používáte knihovny k rozdělení aplikace do několika komponent, doporučujeme, abyste cílili net9.0. Pro zjednodušení je nejlepší zachovat všechny projekty, které tvoří vaši aplikaci ve stejné verzi .NET. Pak můžete předpokládat stejné funkce seznamu BCL všude.

  • Opakovaně použitelné knihovny

    Pokud vytváříte opakovaně použitelné knihovny, které plánujete dodávat na NuGet, zvažte kompromis mezi dosahem a dostupnou sadou funkcí. .NET Standard 2.0 je nejnovější verze podporovaná rozhraním .NET Framework, takže poskytuje dobrý dosah s poměrně velkou sadou funkcí. Nedoporučujeme cílit na .NET Standard 1.x, protože byste omezili dostupnou sadu funkcí pro minimální zvýšení dosahu.

    Pokud nepotřebujete podporovat rozhraní .NET Framework, můžete cílit na .NET Standard 2.1 nebo .NET 9. Doporučujeme přeskočit .NET Standard 2.1 a přejít rovnou na .NET 9. Nejčastěji používané knihovny s více cíli pro .NET Standard 2.0 i .NET 5+. Podpora rozhraní .NET Standard 2.0 nabízí co největší dosah a podpora rozhraní .NET 5+ zajišťuje, že můžete využívat nejnovější funkce platformy pro zákazníky, kteří už jsou na platformě .NET 5 nebo novější.

Problémy s .NET Standard

Tady je několik problémů se standardem .NET, které pomáhají vysvětlit, proč jsou .NET 5 a novější verze lepší způsob sdílení kódu napříč platformami a úlohami:

  • Pomalé přidávání nových rozhraní API

    Rozhraní .NET Standard bylo vytvořeno jako sada rozhraní API, kterou by všechny implementace .NET musely podporovat, takže existuje proces kontroly návrhů pro přidání nových rozhraní API. Cílem bylo standardizovat pouze rozhraní API, která by mohla být implementována ve všech aktuálních a budoucích platformách .NET. Výsledkem bylo, že pokud funkce zmeškala konkrétní verzi, možná budete muset několik let počkat, než se přidá do verze standardu. Pak byste čekali ještě déle, než bude nová verze .NET Standard široce podporovaná.

    Řešení v .NET 5+: Při implementaci funkce je již k dispozici pro každou aplikaci a knihovnu .NET 5 nebo novější, protože základ kódu je sdílený. A protože mezi specifikací rozhraní API a její implementací není žádný rozdíl, můžete využívat nové funkce mnohem rychleji než u .NET Standard.

  • Složitá správa verzí

    Oddělení specifikace rozhraní API od implementace vede ke komplexnímu mapování verzí specifikace rozhraní API a verzí implementace. Tato složitost je zřejmé v tabulce uvedené výše v tomto článku a pokyny, jak ji interpretovat.

    Řešení v .NET 5+: Neexistuje žádné oddělení mezi specifikací rozhraní API .NET 5+ a její implementací. Výsledkem je zjednodušené schéma TFM. Pro všechny úlohy existuje jedna předpona TFM: net9.0 používá se pro knihovny, konzolové aplikace a webové aplikace. Jedinou variantou je přípona, která určuje rozhraní API specifická pro platformu pro konkrétní platformu, například net9.0-windows. Díky této konvenci vytváření názvů TFM můžete snadno zjistit, jestli daná aplikace může danou knihovnu používat. Není potřeba žádná tabulka s číslem verze, jako je ta pro .NET Standard.

  • Nepodporované výjimky platformy za běhu

    .NET Standard zveřejňuje rozhraní API specifická pro platformu. Kód se může zkompilovat bez chyb a zdá se, že je přenosný na libovolnou platformu, i když není přenosný. Když běží na platformě, která nemá implementaci pro dané rozhraní API, zobrazí se chyby za běhu.

    Řešení v .NET 5+: Sady SDK .NET 5+ obsahují analyzátory kódu, které jsou ve výchozím nastavení povolené. Analyzátor kompatibility platformy detekuje neúmyslné použití rozhraní API, která nejsou podporována na platformách, na kterých chcete běžet. Další informace najdete v tématu Analyzátor kompatibility platformy.

.NET Standard není zastaralá

.NET Standard je stále potřeba pro knihovny, které je možné používat v několika implementacích .NET. V následujících scénářích doporučujeme cílit na .NET Standard:

  • Slouží netstandard2.0 ke sdílení kódu mezi rozhraním .NET Framework a všemi ostatními implementacemi rozhraní .NET.
  • Slouží netstandard2.1 ke sdílení kódu mezi mono, Xamarinem a .NET Core 3.x.

Viz také