.NET-Standard

.NET Standard ist eine formale Spezifikation von .NET-APIs, die für verschiedene .NET-Implementierungen verfügbar sind. Die Motivation hinter .NET Standard war es, mehr Einheitlichkeit im .NET-Ökosystem zu erreichen. .NET 5 und höhere Versionen verfolgen einen anderen Ansatz zur Herstellung von Einheitlichkeit, der in den meisten Szenarien die Notwendigkeit von .NET Standard entfällt. Wenn Sie jedoch Code zwischen .NET Framework und einer anderen .NET-Implementierung wie .NET Core freigeben möchten, sollte Ihre Bibliothek auf .NET Standard 2.0 ausgerichtet sein. Es werden keine neuen Versionen von .NET Standard veröffentlicht, aber .NET 5, .NET 6 und alle zukünftigen Versionen unterstützen weiterhin .NET Standard 2.1 und früher.

Informationen zur Auswahl zwischen .NET 5+ und .NET Standard finden Sie weiter unten in diesem Artikel unter .NET 5+ und .NET Standard .

.NET Standard-Versionen

.NET Standard ist versioniert. Jede neue Version fügt weitere APIs hinzu. Wenn eine Bibliothek für eine bestimmte Version von .NET Standard erstellt wird, kann sie in jeder .NET-Implementierung ausgeführt werden, die diese Version von .NET Standard (oder höher) implementiert.

Wenn Sie eine höhere Version von .NET Standard festlegen, kann eine Bibliothek mehr APIs verwenden, bedeutet jedoch, dass sie nur in neueren Versionen von .NET verwendet werden kann. Das Festlegen einer niedrigeren Version reduziert die verfügbaren APIs, bedeutet jedoch, dass die Bibliothek an mehr Orten ausgeführt werden kann.

.NET Standardversion auswählen

.NET Standard 1.0 verfügt über 7.949 der 37.118 verfügbaren APIs.

.NET-Implementierung Versionsunterstützung
.NET und .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.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
Universelle Windows-Plattform 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

Weitere Informationen finden Sie unter .NET Standard 1.0. Eine interaktive Tabelle finden Sie unter .NET Standard-Versionen.

Auswahl der .NET Standard-Zielversion

Sie sollten .NET Standard 2.0 als Ziel verwenden, es sei denn, Sie müssen eine frühere Version unterstützen. Die meisten Bibliotheken für allgemeine Zwecke sollte außerhalb von .NET Standard 2.0 keine APIs erfordern. .NET Standard 2.0 wird von allen modernen Plattformen unterstützt und ist der empfohlene Weg, um mehrere Plattformen mit einem Ziel zu unterstützen.

Wenn Sie .NET Standard 1.x unterstützen müssen, sollten Sie auch .NET Standard 2.0 unterstützen. .NET Standard 1.x wird als ein granularer Satz von NuGet-Paketen verteilt, der ein großes Abhängigkeitsdiagramm erstellt und dazu führt, dass Entwickler beim Erstellen viele Pakete herunterladen. Weitere Informationen finden Sie später in diesem Artikel unter Plattformübergreifende Ziele und .NET 5 oder höher und .NET Standard.

Regeln für die .NET Standard-Versionskontrolle

Es gibt zwei primäre Versionskontrollregeln:

  • Additiv: .NET Standard-Versionen sind logisch konzentrische Kreise: höhere Versionen umfassen alle APIs früherer Versionen. Zwischen den Versionen gibt es keine die Lauffähigkeit der Anwendung beeinträchtigenden Änderungen.
  • Unveränderlich: Nach der Auslieferung von .NET Standard-Versionen erfolgen keine Änderungen.

Nach Version 2.1 gibt es keine neuen .NET Standard-Versionen. Weitere Informationen finden Sie später in diesem Artikel unter .NET 5 oder höher und .NET Standard.

Spezifikation

Die Spezifikation von .NET Standard ist ein standardisierter Satz von APIs. Die Spezifikation wird durch Implementierungsprogramme von .NET verwaltet, insbesondere Microsoft (einschließlich des .NET Frameworks, .NET Core und Mono) und Unity.

Offizielle Artefakte

Die offizielle Spezifikation ist eine Reihe von CS-Dateien zur Definition der APIs, die Bestandteile des Standards sind. Das Ref-Verzeichnis im (jetzt archivierten) dotnet/standard-Repository definiert die .NET-Standard-APIs.

Das NETStandard.Library-Metapaket (Quelle) beschreibt den Satz von Bibliotheken, die (teilweise) eine oder mehrere Versionen von .NET Standard definieren.

Eine bestimmte Komponente wie System.Runtime beschreibt Folgendes:

  • Teil von .NET Standard (nur der Bereich).
  • Mehrere Versionen von .NET Standard für diesen Bereich.

Abgeleitete Elemente werden bereitgestellt, um ein einfacheres Lesen und bestimmte Entwicklungsszenarios (z.B. die Verwendung eines Compilers) zu ermöglichen.

Paketdarstellung

Das primäre Verteilungsinstrument für .NET Standard sind NuGet-Pakete. Implementierungen werden in einer Vielzahl von Methoden abgeleitet, die jeweils für die einzelnen .NET-Implementierungen geeignet sind.

NuGet-Pakete sind auf mindestens ein Framework ausgerichtet. .NET Standard-Pakete zielen auf das Framework „.NET Standard“ ab. Sie können das .NET Standard Framework mithilfe des netstandardkompakten TFM als Ziel verwenden (z. B netstandard1.4. ). Bibliotheken, die auf mehreren Implementierungen von .NET ausgeführt werden sollen, sollten dieses Framework als Ziel haben. Ein Großteil der APIs sollte auf netstandard2.0 ausgerichtet sein, da sich die Anzahl an verfügbaren APIs im Laufe der Versionen .NET Standard 1.6 und 2.0 mehr als verdoppelt hat.

Das Metapaket NETStandard.Library verweist auf den vollständigen Satz von NuGet-Paketen, die .NET Standard definieren. Die gängigste Methode, netstandard als Ziel auszuwählen, ist das Verweisen auf dieses Metapaket. Es beschreibt und bietet Zugriff auf etwa 40 .NET-Bibliotheken und zugehörige APIs, die .NET Standard definieren. Sie können auf zusätzliche Pakete verweisen, die netstandard als Ziel verwenden, um Zugriff auf weitere APIs zu erhalten.

Versionskontrolle

Die Spezifikation ist nicht singulär, sondern eine Reihe linear versionierter APIs. In der ersten Version des Standards wird ein Basissatz von APIs eingerichtet. Nachfolgende Versionen fügen APIs hinzu und erben APIs, die in früheren Versionen definiert wurden. Es gibt keine festgelegte Möglichkeit zum Entfernen von APIs aus dem Standard.

.NET Standard ist weder spezifisch auf eine bestimmte .NET-Implementierung ausgelegt, noch entspricht die Spezifikation dem Versionierungsschema einer dieser Implementierungen.

Wie bereits erwähnt gibt es nach Version 2.1 keine neuen .NET Standard-Versionen.

Verwenden von .NET Standard als Ziel

Sie können .NET Standard-Bibliotheken mithilfe einer Kombination aus dem netstandard-Framework und dem NETStandard.Library-Metapaket erstellen.

Der .NET Framework-Kompatibilitätsmodus

Mit .NET Standard 2.0 wurde der .NET Framework-Kompatibilitätsmodus eingeführt. Mit diesem Kompatibilitätsmodus können .NET Standard-Projekte auf .NET Framework-Bibliotheken verweisen als wären sie für .NET Standard kompiliert. Es kann nicht für alle Projekte auf .NET Framework-Bibliotheken verwiesen werden. Dies ist zum Beispiel bei Bibliotheken der Fall, die Windows Presentation Foundation-APIs (WPF) verwenden.

Weitere Informationen finden Sie unter Der .NET Framework-Kompatibilitätsmodus.

.NET Standard-Bibliotheken und Visual Studio

Um .NET-Standard-Bibliotheken in Visual Studio zu erstellen, stellen Sie sicher, dass Sie Visual Studio 2022, Visual Studio 2019 oder Visual Studio 2017 (Version 15.3 oder höher) unter Windows bzw. Visual Studio für Mac (Version 7.1 oder höher) unter macOS installiert haben.

Wenn Sie nur .NET Standard 2.0-Bibliotheken in Ihren Projekten verarbeiten müssen, können Sie auch Visual Studio 2015 verwenden. Allerdings muss dabei der NuGet-Client 3.6 oder höher installiert sein. Sie können den NuGet-Client für Visual Studio 2015 auf der Seite NuGet-Downloads herunterladen.

.NET 5 oder höher und .NET Standard

Bei .NET 5 und .NET 6 handelt es sich um einzelne Produkte mit einheitlichen Funktionen und APIs, die für Windows-Desktop-Apps und plattformübergreifende Konsolen-Apps, Clouddienste und Websites verwendet werden können. Die .NET 5-TFMs spiegeln beispielsweise diese breite Palette von Szenarien wider:

  • net5.0

    Dieser TFM ist für Code bestimmt, der überall ausgeführt werden kann. Mit wenigen Ausnahmen sind nur Technologien enthalten, die plattformübergreifend funktionieren. Für .NET 5-Code ersetzt net5.0 die TFMs netcoreapp und netstandard.

  • net5.0-windows

    Dies ist ein Beispiel für einen betriebssystemspezifischen TFM, der allen Elementen, auf die net5.0 verweist, betriebssystemspezifische Funktionen hinzufügt.

Verwenden von .NET 5.0 oder .NET 6.0 als Zielversion im Vergleich zu .NET Standard

Bei vorhandenem Code, der auf netstandard abzielt, ist es nicht erforderlich, den TFM in net5.0 oder net6.0 zu ändern. .NET 5 und .NET 6 implementieren .NET Standard 2.1 und frühere Versionen. Der einzige Grund, erneut von .NET Standard auf .NET 5 oder höher umzusteigen, wäre der Zugriff auf weitere Runtimefeatures, Sprachfeatures oder APIs. Sie müssen beispielsweise .NET 5 oder eine höhere Version als Ziel verwenden, um C# 9 verwenden zu können. Sie können auch .NET 5 oder .NET 6 und .NET Standard als Zielversion festlegen, um Zugriff auf neuere Features zu erhalten und Ihre Bibliothek weiterhin anderen .NET-Implementierungen zur Verfügung zu stellen.

Hier finden Sie einige Richtlinien für neuen Code für .NET 5 oder höher:

  • App-Komponenten

    Wenn Sie Bibliotheken verwenden, um eine Anwendung in mehrere Komponenten zu unterteilen, wird empfohlen, net5.0 oder net6.0 als Ziel zu verwenden. Der Einfachheit halber sollten Sie für alle Projekte, aus denen Ihre Anwendung besteht, dieselbe .NET-Version verwenden. Folglich können Sie die gleichen BCL-Features von überall aus verwenden.

  • Wiederverwendbare Bibliotheken

    Wenn Sie wiederverwendbare Bibliotheken erstellen, die NuGet enthalten soll, sollten Sie den Kompromiss zwischen Reichweite und verfügbaren Features berücksichtigen. .NET Standard 2.0 ist die neueste von .NET Framework unterstützte Version, sodass diese Spezifikation eine große Reichweite und relativ viele Features bietet. Es wird nicht empfohlen, .NET Standard 1.x als Ziel festzulegen, da Sie so die Anzahl der verfügbaren Features für eine minimal größere Reichweite reduzieren würden.

    Wenn Sie .NET Framework nicht unterstützen müssen, können Sie .NET Standard 2.1 oder .NET 5/6 verwenden. Es wird empfohlen, .NET Standard 2.1 zu überspringen und direkt .NET 6 zu verwenden. Die am häufigsten verwendeten Bibliotheken haben mit .NET Standard 2.0 und .NET 5 mehrere Zielversionen. Die Unterstützung von .NET Standard 2.0 bietet die größte Reichweite, während durch die Unterstützung von .NET 5 oder höher sichergestellt wird, dass Sie die neuesten Plattformfeatures für Kunden nutzen können, die bereits .NET 5 oder höher verwenden.

Probleme mit .NET Standard

Im Folgenden werden einige Probleme mit .NET Standard erläutert, die aufzeigen, warum .NET 5 und höhere Versionen die bessere Wahl beim Freigeben von Code für Plattformen und Workloads sind:

  • Langsames Hinzufügen neuer APIs

    .NET Standard wurde als API-Satz erstellt, der von allen .NET-Implementierungen unterstützt werden sollte, sodass es einen Überprüfungsprozess für Vorschläge zum Hinzufügen neuer APIs gab. Ziel war es, nur die APIs zu standardisieren, die in alle aktuellen und zukünftigen .NET-Plattformen implementiert werden könnten. Dies hatte zur Folge, dass Sie möglicherweise einige Jahre warten mussten, bis ein Feature, das zuvor nicht in einem Release verfügbar war, zu einer Version des Standards hinzugefügt wurde. Dann mussten Sie noch länger warten, bis die neue Version von .NET Standard umfassend unterstützt wird.

    Lösung in .NET 5 oder höher: Wenn ein Feature implementiert wird, ist es bereits für jede .NET 5-App (oder höhere Version) und -Bibliothek verfügbar, da die Codebasis freigegeben ist. Da es keinen Unterschied zwischen der API-Spezifikation und der Implementierung gibt, können Sie neue Features viel schneller nutzen als mit .NET Standard.

  • Komplexe Versionsverwaltung

    Die Trennung der API-Spezifikation von ihren Implementierungen führt zu einer komplexen Zuordnung zwischen API-Spezifikationsversionen und Implementierungsversionen. Diese Komplexität wird in der zuvor in diesem Artikel gezeigten Tabelle und in den Anweisungen zur Interpretation erläutert.

    Lösung in .NET 5 oder höher: Es gibt keine Trennung zwischen einer API-Spezifikation von .NET 5 oder höher und ihrer Implementierung. Das Ergebnis ist ein vereinfachtes TFM-Schema. Es gibt ein TFM-Präfix für alle Workloads: net5.0 oder net6.0 wird für Bibliotheken, Konsolen-Apps und Web-Apps verwendet. Die einzige Variation ist ein Suffix, das plattformspezifische APIs für eine bestimmte Plattform angibt (z. B. net5.0-windows oder net6.0-windows). Dank dieser TFM-Namenskonvention können Sie leicht erkennen, ob eine bestimmte App eine bestimmte Bibliothek verwenden kann. Es ist keine äquivalente Tabelle mit Versionsnummern wie jene für .NET Standard erforderlich.

  • Nicht von der Plattform unterstützte Ausnahmen zur Laufzeit

    .NET Standard macht plattformspezifische APIs verfügbar. Der Code wird möglicherweise fehlerfrei kompiliert und scheint auf jede beliebige Plattform portierbar zu sein, auch wenn er nicht portierbar ist. Bei der Ausführung auf einer Plattform, die über keine Implementierung für eine bestimmte API verfügt, erhalten Sie Laufzeitfehler.

    Lösung in .NET 5 oder höher: Die SDKs von .NET 5 oder höher enthalten Codeanalysetools, die standardmäßig aktiviert sind. Das Analysetool für die Plattformkompatibilität erkennt die unbeabsichtigte Verwendung von APIs, die auf den Plattformen, auf denen Sie sie ausführen möchten, nicht unterstützt werden. Weitere Informationen finden Sie unter Analysetool für die Plattformkompatibilität.

.NET Standard nicht veraltet

Für die Bibliotheken, die von mehreren .NET-Implementierungen verwendet werden können, wird .NET Standard weiterhin benötigt. Es wird empfohlen, .NET Standard in den folgenden Szenarios als Ziel zu verwenden:

  • Verwenden Sie netstandard2.0, um Code für .NET Framework und alle anderen Implementierungen von .NET freizugeben.
  • Verwenden Sie netstandard2.1, um Code für Mono, Xamarin und .NET Core 3.x freizugeben.

Weitere Informationen