.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 übernimmt jedoch einen anderen Ansatz, um diese Einheitlichkeit sicherzustellen. Durch diesen neuen Ansatz entfällt die Notwendigkeit von .NET Standard in vielen Szenarios. Weitere Informationen finden Sie später in diesem Artikel unter .NET 5 und .NET Standard.

Unterstützung der .NET-Implementierung

Die verschiedenen .NET-Implementierungen verwenden spezifische Versionen von .NET Standard als Ziel. Jede .NET-Implementierung kündigt die höchste .NET Standardversion an, die von ihr unterstützt wird, was bedeutet, dass sie auch frühere Versionen unterstützt. .NET Framework 4.6 implementiert z. B. .NET Standard 1.3 und stellt damit alle APIs bereit, die in den Versionen 1.0 bis 1.3 von .NET Standard definiert sind. Auf ähnliche Weise implementiert .NET Framework 4.6.1 .NET Standard 1.4, während .NET 5.0 .NET Standard 2.1 implementiert.

In der folgenden Tabelle sind die mindestens erforderlichen Implementierungsversionen aufgeführt, die sämtliche .NET Standard-Versionen unterstützen. Dies bedeutet, dass höhere Versionen einer aufgelisteten Implementierung auch die entsprechende Version von .NET Standard unterstützen. Beispielsweise unterstützen .NET Core 2.1 und höhere Versionen auch .NET Standard 2.0 und frühere Versionen.

.NET-Standard 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0 2.1
.NET 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
.NET Core 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 3.0
.NET Framework 1 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1 2 4.6.1 2 4.6.1 2 Nicht zutreffend3
Mono 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5.4 6.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14 12.16
Xamarin.Mac 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.8 5.16
Xamarin.Android 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0 10.0
Universelle Windows-Plattform 10.0 10.0 10.0 10.0 10.0 10.0.16299 10.0.16299 10.0.16299 Wird nachgeliefert.
Unity 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2021.2.0b6

1 Die für .NET Frameworks aufgeführten Versionen gelten für das .NET Core 2.0 SDK und höhere Versionen des Tools. Ältere Versionen haben eine andere Zuordnung für .NET Standard 1.5 und höher verwendet. Sie können Tools für .NET Core-Tools für Visual Studio 2015 herunterladen, falls Sie kein Upgrade auf Visual Studio 2017 oder eine höhere Version durchführen können.

2 Die hier aufgelisteten Versionen stellen die Regeln dar, die von NuGet verwendet werden, um zu bestimmen, ob eine vorhandene .NET Standard-Bibliothek anwendbar ist. Zwar sieht NuGet die .NET-Standards 1.5 bis 2.0 als durch .NET Framework 4.6.1 unterstützt an, jedoch treten verschiedene Probleme mit der Nutzung von .NET Standard-Bibliotheken auf, die für diese Versionen aus .NET Framework 4.6.1-Projekten erstellt wurden. Für .NET Framework-Projekte, die auf diese Bibliotheken angewiesen sind, empfehlen wir, ein Upgrade des Projekts auf die Zielplattform .NET Framework 4.7.2 oder höher durchzuführen.

3 .NET Standard 2.1 wird von .NET Framework nicht unterstützt. Weitere Informationen finden Sie in der Ankündigung von .NET Standard 2.1.

  • Die Spalten stellen die .NET Standard-Versionen dar. Jede Zelle enthält einen Link zu einem Dokument, im dem die APIs angegeben sind, die in dieser Version von .NET Standard hinzugefügt wurden.
  • Die Zeilen stellen die verschiedenen .NET-Implementierungen dar.
  • Die Versionsnummer in jeder Zelle gibt an, welche Version der Implementierung Sie mindestens benötigen, um diese Version von .NET Standard als Ziel zu setzen.
  • Eine interaktive Tabelle finden Sie unter .NET Standard-Versionen.

Führen Sie die folgenden Schritte aus, um die höchste Version von .NET Standard zu ermitteln, die Sie als Ziel verwenden können:

  1. Suchen Sie die Zeile, die die .NET-Implementierung angibt, die Sie ausführen möchten.
  2. Suchen Sie in dieser Zeile die Spalte, in der Ihre Version angegeben ist (von rechts nach links).
  3. Die Spaltenüberschrift gibt die .NET Standard-Version an, die Ihr Ziel unterstützt. Sie können auch eine niedrigere .NET Standard-Version als Ziel verwenden. Auch höhere .NET Standard-Versionen unterstützen die Implementierung.
  4. Wiederholen Sie diesen Vorgang für jede Plattform, die als Ziel verwendet werden soll. Wenn Sie mehrere Zielplattformen verwenden, sollten Sie die kleinste unterstützten Versionen auswählen. Wenn Sie .NET Standard z. B. auf .NET Framework 4.8 und .NET 5.0 ausführen möchten, ist die höchste .NET Standard-Version, die Sie verwenden können, .NET Standard 2.0.

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 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 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 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 über den netstandard komprimierten TFM (z. B. netstandard1.4) das .NET Standard-Framework als Ziel angeben. 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

Vergewissern Sie sich, dass unter Windows Visual Studio 2019 oder Visual Studio 2017 Version 15.3 oder höher bzw. unter macOS Visual Studio für Mac Version 7.1 oder höher installiert ist, damit Sie .NET Standard-Bibliotheken in Visual Studio erstellen können.

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 und .NET Standard

.NET 5 ist die Implementierung von .NET, die Microsoft aktiv entwickelt. Dabei handelt es sich um ein einzelnes Produkt 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.0-Zielframeworkmoniker (TFMs) spiegeln diese große Bandbreite von Szenarios 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 betriebssystemspezifische TFMs, die allen Elementen, auf die net5.0 verweist, betriebssystemspezifische Funktionen hinzufügen.

Informationen zum Abzielen auf „net5.0“ bzw. „netstandard“

Bei vorhandenem Code, der auf netstandard abzielt, ist es nicht erforderlich, den TFM in net5.0 zu ändern. .NET 5.0 implementiert .NET Standard 2.1 und frühere Versionen. Der einzige Grund für das erneute Abzielen von .NET Standard auf .NET 5.0 wäre der Zugriff auf weitere Runtimefeatures, Sprachfeatures oder APIs. Sie müssen .NET 5.0 als Ziel verwenden, um beispielsweise C# 9 verwenden zu können. Sie können auch .NET 5.0 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:

  • App-Komponenten

    Wenn Sie Bibliotheken verwenden, um eine Anwendung in verschiedene Komponenten aufzuteilen, empfiehlt es sich, net5.x als Ziel zu verwenden, wobei 5.x die früheste Version von .NET 5 ist, auf die Ihre Anwendung abzielen kann. 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 verwenden. Es wird empfohlen, .NET Standard 2.1 zu überspringen und direkt .NET 5 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 sichergestellt wird, dass Sie die neuesten Plattformfeatures für Kunden nutzen können, die bereits .NET 5 verwenden.

Probleme mit .NET Standard

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

  • 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: Wenn ein Feature implementiert wird, ist es bereits für jede .NET 5-App 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: Es gibt keine Trennung zwischen einer .NET 5.x-API-Spezifikation und ihrer Implementierung. Das Ergebnis ist ein vereinfachtes TFM-Schema. Es gibt ein TFM-Präfix für alle Workloads: net5.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). 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: Das .NET 5 SDK umfasst 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