.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 verwenden einen anderen Ansatz zum Einrichten von Einheitlichkeit, der den .NET Standard in den meisten Szenarien überflüssig macht. 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 und alle späteren Versionen werden weiterhin .NET Standard 2.1 und früher unterstützen.
Informationen zum Auswählen zwischen .NET 5+ und .NET Standard finden Sie unter .NET 5+ und .NET Standard weiter unten in diesem Artikel.
.NET Standard-Versionen
.NET Standard ist mit einer Versionsangabe versehen. Jede neue Version fügt weitere APIs hinzu. Wenn eine Bibliothek mit einer bestimmten 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.
Durch die Ausrichtung auf eine höhere Version von .NET Standard kann eine Bibliothek mehr APIs verwenden, aber das bedeutet, dass sie nur unter neueren Versionen von .NET verwendet werden kann. Die Ausrichtung auf eine niedrigere Version reduziert die verfügbaren APIs, bedeutet jedoch, dass die Bibliothek an mehr Stellen ausgeführt werden kann.
Auswählen der .NET Standard-Version
.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, 8.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
Wenn Sie .NET Standard als Ziel verwenden, empfehlen wir, .NET Standard 2.0 als Ziel zu verwenden, es sei denn, Sie müssen eine frühere Version unterstützen. Die meisten universellen Bibliotheken sollten keine APIs außerhalb von .NET Standard 2.0 benötigen, und .NET Framework unterstützt .NET Standard 2.1 nicht. .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. Dadurch entsteht ein umfangreiches Paketabhängigkeitsdiagramm, und bei der Erstellung des Projekts wird eine Vielzahl von Paketen heruntergeladen. Weitere Informationen finden Sie später in diesem Artikel unter Plattformübergreifende Ziele und .NET 5 oder höher und .NET Standard.
Hinweis
Ab .NET 9 wird eine Buildwarnung ausgegeben, wenn Ihr Projekt auf .NET Standard 1.x ausgerichtet ist. Weitere Informationen finden Sie unter Warnung für .NET Standard 1.x-Ziele.
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.
- API-Liste in Markdown.
- Referenzassemblys, die als NuGet-Pakete verteilt und vom Metapaket NETStandard.Library referenziert werden.
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 den kompakten Zielframeworkmoniker (Target Framework Moniker, TFM) netstandard
verwenden, um das .NET Standard-Framework als Ziel anzugeben (Beispiel: netstandard1.4
). Bibliotheken, die in mehreren Implementierungen von .NET ausgeführt werden sollen, müssen das .NET Standard-Framework als Ziel haben. Verwenden Sie netstandard2.0
als Ziel, um das größtmögliche Spektrum von APIs nutzen zu können, da sich die Anzahl verfügbarer APIs zwischen .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 Visual Studio 2022, Visual Studio 2019 oder Visual Studio 2017, Version 15.3 oder höher unter Windows installiert ist.
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, .NET 6, .NET 7, .NET 8 und .NET 9 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 8-TFMs spiegeln beispielsweise diese breite Palette von Szenarien wider:
net8.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 8-Code ersetzt
net8.0
die TFMsnetcoreapp
undnetstandard
.net8.0-windows
Dies ist ein Beispiel für einen betriebssystemspezifischen TFM, der allen Elementen, auf die
net8.0
verweist, betriebssystemspezifische Funktionen hinzufügt.
Wann sollte net8.0
und wann netstandard
als Ziel verwendet werden?
Bei bereits vorhandenem Code, der auf .NET Standard 2.0 oder auf eine höhere Version ausgerichtet ist, ist es nicht erforderlich, den TFM in net8.0
oder in einen späteren TFM zu ändern. .NET 8 implementiert .NET Standard 2.1 und frühere Versionen. Der einzige Grund für das erneute Abzielen von .NET Standard auf .NET 8 wäre der Zugriff auf weitere Runtimefeatures, Sprachfeatures oder APIs. Wenn Sie also beispielsweise C# 9 verwenden möchten, müssen Sie .NET 5 oder eine höhere Version als Ziel verwenden. Sie können auch .NET 8 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.
Hinweis
Wenn Ihr Projekt auf .NET Standard 1.x ausgerichtet ist, empfiehlt es sich, es stattdessen auf .NET Standard 2.0 oder mindestens auf .NET 6 auszurichten. Weitere Informationen finden Sie unter Warnung für .NET Standard 1.x-Ziele.
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,
net8.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 8 als Ziel verwenden. Es wird empfohlen, .NET Standard 2.1 zu überspringen und direkt .NET 8 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:
net8.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.net8.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.