.NET Standard vs .NET Core

240

Ich habe über den Unterschied zwischen .NET Standard und .NET Core gelesen, weiß aber nicht, was der Unterschied ist oder wann ich ein .NET Standard-Bibliotheksprojekt und wann ich ein .NET Core-Bibliotheksprojekt auswählen soll.

Ich habe gelesen, dass .NET Standard sicherstellen soll, dass unabhängig von der verwendeten Plattform immer eine Reihe von APIs verfügbar sind (sofern diese Plattform mit der von mir ausgewählten .NET Standard-Version kompatibel ist). Wenn ich mich nicht irre, bedeutet dies, dass ich eine Klassenbibliothek von .NET Standard erstellen und sie dann auf jeder Plattform verwenden kann, die mit der von mir ausgewählten .NET Standard-Version kompatibel ist.

Mit .NET Core habe ich gelesen, dass es auch für die plattformübergreifende Verwendung vorgesehen ist. Wenn ich mich also für eine .NET Core-Bibliothek entscheide, kann ich sie anscheinend auch auf vielen Plattformen verwenden, genau wie .NET Standard.

Am Ende sehe ich also keinen Unterschied. Wann soll ich welche verwenden? Was ist der Unterschied zwischen ihnen?

Álvaro García
quelle
33
In Code-Begriffen: .net Standard = Schnittstelle, .net Core = Klasse; Wenn Sie gegen die Klasse codieren, erhalten Sie möglicherweise mehr Methoden (usw.), aber Sie sind auf diesen konkreten Typ (und Nachkommen) beschränkt. Wenn Sie die Schnittstelle verwenden, erhalten Sie möglicherweise eine kleinere Oberfläche, aber sie funktioniert gegen beliebige Implementierungen ... solange diese Implementierungen das tun, was erwartet wird :) Ja, der .net-Kern zielt auf mehrere Plattformen ab, aber es gibt andere Implementierungen von .net Standard
Marc Gravell
9
.NETStandard ist ein Ersatz für PCL. Mithilfe einer tragbaren Klassenbibliothek konnten Sie eine Bibliothek schreiben, die auf mehr als einer Plattform (Telefon, Desktop, Geschäft, Browser, Xbox usw.) ausgeführt werden kann. Es skalierte nicht sehr gut und litt stark unter dem n! Problem, also gaben sie es auf. .NETCore ist nur das erste Framework, das sie erstellt haben. Es war das einfachste, der Rest muss aufholen. Denken Sie daran, dass dies sehr viel in Arbeit ist und große Änderungen mit .NETStandard v2.0 bevorstehen. Der Standard, um sie alle
vorerst
Bitte fügen Sie keine zusätzlichen Fragen zu einer vorhandenen hinzu. Ihre Frage in der Bearbeitung ist davon getrennt.
Jon Skeet
1
@ JonSkeet Dann sollte ich eine neue Frage öffnen? Danke für den Rat. weil ich zuerst eine neue Frage zu .net Core Multi Target geöffnet habe und abgelehnt wurde, weil sie sagten, es sei eine doppelte Frage.
Álvaro García
@ ÁlvaroGarcía: Ja, aber machen Sie es klar - Ihre aktuelle Frage mit einem Satz ist mir überhaupt nicht klar.
Jon Skeet

Antworten:

195

Ich werde versuchen, Ihre Zweifel weiter zu klären und die Antwort von Jon Skeet zu erweitern.

.NET Standard ist eine Spezifikation , sodass eine für eine bestimmte .NET Standard-Version kompilierte Bibliothek in verschiedenen .NET Standard-Implementierungen verwendet werden kann.

Wie in meinem anderen Kommentar erwähnt, ist eine gute Analogie für die Beziehung zwischen .NET Standard und anderen .NET Standard-Implementierungen (.NET Core, .NET Framework usw.) das Wesentliche von David Fowler : .NET Standard-Versionen sind Interfaces, während Frameworks sind Implementierungen dieser Schnittstellen.

Dieses vereinfachte Diagramm kann helfen, diese Beziehung zu verstehen:

Analogie zu NET-Standardschnittstellen

Alle Ziele NetCore10haben Zugriff auf INetStandard15APIs und NetCore10 bestimmte APIs (z. B. DotNetHostPolicy).

Natürlich kann diese Bibliothek nicht in verschiedenen INetStandard15Implementierungen verwendet werden ( NetCore10ist nicht konvertierbar in NetFramework462oder Mono46).

Wenn Sie stattdessen brauchen nur Zugriff auf INetStandard15APIs (und Ziel , dass Spezifikation anstelle eines konkreten Rahmen) Ihrer Bibliothek kann durch verwendet werden jeden es Rahmen die Geräte ( NetCore10, NetFramework462usw.)

Hinweis: In der ursprünglichen Analogie verwendete David Fowler Schnittstellen sowohl für .NET Standard-Versionen als auch für Framework-Implementierungen. Ich glaube, dass die Verwendung von Schnittstellen und Klassen intuitiver ist und die Beziehung zwischen Spezifikationen und konkreten Implementierungen besser darstellt.

Federico Dipuma
quelle
2
Vielen Dank dafür. Aber ich habe Zweifel. Wenn .net-Standard eine Schnittstelle ist und beispielsweise mit .net-Framework und .net-Core implementiert werden kann, wenn ich eine .net-Standardklassenbibliothek erstelle und diese Bibliothek in einem anderen Projekt verwende, welche Implementierung wird verwendet, net-Framework oder .net Ader?
Álvaro García
8
Es wird die Implementierung der kompilierten Anwendung verwenden (was auch immer es ist). Wenn Sie eine NET-Kern-App kompilieren, werden NET-Kernbibliotheken (die eine Implementierung des NET-Standards sind) verwendet
Federico Dipuma
5
Dieses Diagramm ist eine fantastische Hilfe bei der Veranschaulichung der Beziehung zwischen Kern, Standard und Framework.
Jasper
Wenn ich also eine net461-Konsolen-App erstelle und auf eine netstandard2.0-Bibliothek abziele, wird in der Konsolen-App nichts aus dieser Standardbibliothek aufgelöst. So... ??
Sinaesthetic
2
Ein Bild
sagt mehr
182

.NET Core ist eine Implementierung von .NET Standard. Es ist auf mehreren Betriebssystemen verfügbar, aber das ist nicht dasselbe - es gibt auch andere Implementierungen von .NET Standard.

Wenn Sie also eine .NET Core-Bibliothek erstellen, hat diese Zugriff auf Dinge, die in .NET Core implementiert sind, aber nicht Teil von .NET Standard sind, und Ihre Bibliothek ist nicht mit anderen Implementierungen von .NET Standard kompatibel . wie Xamarin, Tizen, vollständiges .NET-Desktop-Framework usw.

Kurz gesagt: Um maximale Portabilität zu erzielen, sollten Sie Ihre Bibliothek zum .NET-Standard machen.

Jon Skeet
quelle
5
@ ÁlvaroGarcía: Was meinst du mit "es" sollte kompatibel sein? .NET Core 1.0? Nicht unbedingt - denn .NET Core 1.0 kann noch zusätzliche Dinge enthalten. Dieser Eintrag bedeutet, dass Sie den Code sowohl unter Mono 4.6 als auch unter .NET Core 1.0 ausführen können, wenn Sie auf .NET Standard 1.6 abzielen .
Jon Skeet
4
Sie können eine .NET Core-Assembly nur auf .NET Core (CoreCLR & CoreFX) ausführen. Sie können eine .NET Standard-Assembly auf jedem Framework ausführen, das die vertraglichen Verpflichtungen für den jeweiligen Standard (1.3, 1.6, 2.0 usw.) erfüllt.
Mark Rendle
2
Plattformübergreifend bezieht sich auf das Betriebssystem, nicht auf das Framework.
Mark Rendle
15
Stellen Sie sich als Analogie .NET Standard als Schnittstelle vor (z INetStandard16. B. ). .NET Core 1.0 und Mono 4.6 werden beide implementiert INetStandard16. Sie können .Net Core 1.0 nicht in Mono 4.6 konvertieren (und umgekehrt), aber alles, was verwendet INetStandard16wird, funktioniert auf beiden. (
Dank
6
Das hat mich überrascht. Die Namen scheinen rückwärts zu sein. Sie würden denken, etwas namens "Kern" wäre das minimalere der beiden ...
jpmc26
6

Die .NET Core Class-Bibliothek ist im Grunde eine Teilmenge der .NET Framework-Bibliothek, die nur weniger APIs enthält. Das Festhalten an der .NET Core Class-Bibliothek erschwert die gemeinsame Nutzung von Code zwischen Laufzeiten. Dieser Code funktioniert möglicherweise nicht für eine andere Laufzeit (Mono für Xamarin), da er nicht über die von Ihnen benötigte API verfügt. Um dies zu lösen, gibt es .NET Standard, eine Spezifikation, die Ihnen sagt, welche APIs Sie verwenden können . Der Hauptzweck von .NET Standard besteht darin, Code zwischen Laufzeiten gemeinsam zu nutzen. Und es ist wichtig, dass diese Spezifikation von allen Laufzeiten implementiert wird. (.NET Framework, .NET Core und Mono für Xamarin).

Wenn Sie also sicher sind, dass Sie Ihre Bibliothek nur für .NET Core-Projekte verwenden, können Sie .NET Standard ignorieren. Wenn jedoch nur eine geringe Wahrscheinlichkeit besteht, dass Ihr Code von .NET Framework oder Mono für Xamarin verwendet wird, ist dies besser sich an .NET Standard halten

Beachten Sie auch, dass höhere Versionen von .NET Standard mehr APIs enthalten, niedrigere Versionen jedoch von mehr Plattformen unterstützt werden. Wenn Sie daher eine .NET Standard-Bibliothek erstellen, die Sie zwischen den Laufzeiten gemeinsam nutzen möchten, wählen Sie die niedrigste Version aus , mit der Sie die meisten Plattformen erreichen können. Wenn Sie beispielsweise unter .NET Framework 4.5 und .NET Core 1.0 ausführen möchten, können Sie als .NET Standard 1.1 die höchste .NET Standard-Version verwenden. Weitere Informationen hierzu finden Sie in dieser großartigen Tabelle in der Dokumentation .

PS: Auch wenn Sie Ihre Bibliothek in .NET Standard konvertieren möchten, kann Ihnen der .NET Portability Analyzer dabei helfen.

user2771704
quelle
4

.NET Standard ist eine Spezifikation von .NET-APIs, die in .NET-Implementierungen verfügbar sein sollen. Auf diese Weise können einheitliche BCL-APIs für alle .NET-Implementierungen definiert werden.

.NET Core ist eine solche Implementierung von .NET Standard. .NET Framework ist eine weitere Implementierung von .NET Standard.

Bild aus dem .NET-Blog

Geben Sie hier die Bildbeschreibung ein

Die Antwort von Federicos gibt Ihnen einen grafischen Überblick darüber, wie sich jedes Framework mit den Versionen entwickelt. Schauen Sie sich das folgende Diagramm aus Microsoft Docs an .

Geben Sie hier die Bildbeschreibung ein

Durch das Targeting von .NET Standard wird die Plattformunterstützung erhöht, während durch das Targeting auf eine bestimmte .NET-Plattform wie .NET Core (oder .NET Framework) alle Plattformfunktionen für diese Plattform verwendet werden können.

Nipuna
quelle
2

.NET Standard ist eine Spezifikation von APIs, die alle .NET-Implementierungen bereitstellen müssen. Es bringt Konsistenz in die .NET-Familie und ermöglicht es Ihnen, Bibliotheken zu erstellen, die Sie aus jeder .NET-Implementierung verwenden können. Es ersetzt PCLs zum Erstellen gemeinsam genutzter Komponenten.

.NET Core ist eine Implementierung des .NET-Standards, die für die Erstellung von Konsolenanwendungen, Webanwendungen und Cloud-Diensten mit ASP.NET Core optimiert ist. Das SDK enthält ein leistungsstarkes Tool, das zusätzlich zur Visual Studio-Entwicklung einen vollständigen befehlszeilenbasierten Entwicklungsworkflow unterstützt. Weitere Informationen finden Sie unter aka.ms/netstandardfaq und aka.ms/netcore .


Das oben Gesagte sowie eine sehr klare Erklärung der meisten in dieser Frage behandelten Themen finden Sie in dem folgenden äußerst hilfreichen Artikel von Microsoft (MSDN - September 2017): .NET Standard - Entmystifizierung von .NET Core und .NET Standard

Steliosalex
quelle
0

Meinten Sie .NET Framework? Weil der .NET-Standard eine Implementierung wie .NET Framework, .NET Core und Xamarin ist.

Ich liebe .NET Core, weil wir es unter Linux hosten können (verwenden Sie nach meiner Erfahrung Nginx). Es unterscheidet sich von .NET Framework, das Sie nur auf IIS hosten können. In diesem Fall können Sie über das Hosting-Budget nachdenken (weil Windows Server für mich teuer ist).

In der Perspektive der Entwicklungsumgebung ist der .Net-Kern leichtgewichtig. Sie können also VSCode, Sublime, für IDE verwenden (nicht nur Visual Studio).

Fityan Aula
quelle
0

In einfachen Worten wird der .NET-Standard zum Schreiben von Klassenbibliotheksprojekten verwendet, die in DLL kompiliert werden. .NET Core kann zum Entwickeln von tatsächlichen Webanwendungen verwendet werden, die auf allen Betriebssystemen (Windows, Linux, MacOS) ausgeführt werden können. (In .NET Core 3 bietet Microsoft die Funktionalität zum Entwickeln von Desktop-Apps mit WPF. Bisher sind diese Apps jedoch nicht plattformübergreifend und können nur unter Windows ausgeführt werden. In Zukunft werden sie möglicherweise auch plattformübergreifend von Microsoft ausgeführt.) .NET-Standard Bibliotheken / DLLs können in jeder Anwendung verwendet werden, die .NET (.NET Framework, .NET Core) verwendet. Dies bedeutet, dass Sie den .NET-Standard sowohl mit .NET Framework als auch mit .NET Core verwenden können.

Waleed Naveed
quelle