.NET Standard vs .NET Core

240

J'ai lu la différence entre .NET Standard et .NET Core, mais je ne sais vraiment pas quelle est la différence, ni quand choisir un projet de bibliothèque .NET Standard et quand choisir un projet de bibliothèque .NET Core.

J'ai lu que .NET Standard est de s'assurer qu'un ensemble d'API est toujours disponible, quelle que soit la plateforme utilisée (tant que cette plateforme est compatible avec la version .NET Standard que j'ai choisie). Si je ne me trompe pas, cela signifie que je peux créer une bibliothèque de classes de .NET Standard, puis l'utiliser sur n'importe quelle plate-forme compatible avec la version .NET Standard que j'ai choisie.

Avec .NET Core, j'ai lu qu'il est également destiné à une utilisation multiplateforme, donc si je choisis une bibliothèque .NET Core, il semble que je puisse également l'utiliser sur de nombreuses plates-formes, tout comme .NET Standard.

Donc à la fin, je ne vois pas la différence. Quand devrais-je utiliser quoi? Quelle est la différence entre eux?

Álvaro García
la source
33
En termes de code: .net standard = interface, .net core = classe; si vous codez contre la classe, vous pouvez obtenir plus de méthodes (etc.), mais vous êtes limité à ce type concret (et aux descendants); si vous utilisez l'interface, vous obtiendrez peut- être une surface plus petite, mais cela fonctionnera contre les implémentations arbitraires ... tant que ces implémentations font ce qui est attendu :) oui, le noyau .net cible plusieurs plates-formes, mais il existe d' autres implémentations de .net standard
Marc Gravell
9
.NETStandard remplace PCL. Une bibliothèque de classes portable vous a aidé à écrire une bibliothèque qui pourrait fonctionner sur plusieurs plates-formes (téléphone, bureau, magasin, navigateur, xbox, etc.). Il n'a pas très bien évolué, souffrant gravement du n! problème, alors ils l'ont abandonné. .NETCore n'est que le premier framework qu'ils ont fait, c'était le plus simple, le reste doit rattraper son retard. Gardez à l'esprit qu'il s'agit d'un travail en cours, de grands changements à venir avec .NETStandard v2.0. La norme pour les gouverner tous, pour l'instant :)
Hans Passant
Veuillez ne pas ajouter de questions supplémentaires à une question existante. Votre question dans l'édition est distincte de cela.
Jon Skeet
1
@JonSkeet Alors je devrais ouvrir une nouvelle question? Merci pour le conseil. car au début, j'ai ouvert une nouvelle quesetion sur .net Core multi target et j'ai été rétrogradé car ils ont dit que c'était une question en double.
Álvaro García
@ ÁlvaroGarcía: Oui, mais soyez clair - votre question actuelle d'une phrase ne m'est pas claire du tout.
Jon Skeet

Réponses:

195

Je vais essayer de clarifier davantage vos doutes et d'étendre la réponse de Jon Skeet.

.NET Standard est une spécification , donc une bibliothèque compilée pour une version spécifique de .NET Standard peut être utilisée dans différentes implémentations de .NET Standard.

Comme dit dans mon autre commentaire, une bonne analogie pour la relation entre .NET Standard et les autres implémentations .NET Standard (.NET Core, .NET Framework, etc.) est cet essentiel de David Fowler : les versions .NET Standard le sont Interfaces, tandis que les cadres sont implémentations de ces interfaces.

Ce diagramme simplifié peut aider à comprendre cette relation:

Analogie des interfaces standard NET

Tout ciblage NetCore10a accès à des INetStandard15API et à NetCore10 des API spécifiques (telles que DotNetHostPolicy).

Bien sûr, cette bibliothèque ne peut pas être utilisée dans différentes INetStandard15implémentations ( NetCore10n'est pas convertible en NetFramework462ou Mono46).

Si vous, au contraire, l' accès nécessaire uniquement aux INetStandard15API (et cible spécification à la place d'un cadre de béton) votre bibliothèque peut être utilisé par tout cadre qui met en œuvre ( NetCore10, NetFramework462, etc.)

Remarque: dans l'analogie d'origine, David Fowler a utilisé des interfaces pour les versions .NET Standard et les implémentations de frameworks. Je crois que l'utilisation d'interfaces et de classes est, au contraire, plus intuitive et représente mieux la relation entre les spécifications et les implémentations concrètes.

Federico Dipuma
la source
2
Merci beaucoup pour cela. Mais j'ai un doute. Si .net standard est une interface et peut être implémenté par exemple avec .net framework et .net Core, lorsque je crée une bibliothèque de classes standard .net et que j'utilise cette bibliothèque dans un autre projet, quelle implémentation utilise, net framework ou .net Coeur?
Álvaro García
8
Il utilisera l'implémentation de l'application compilée (quelle qu'elle soit). Si vous compilez une application de base NET, elle utilisera les bibliothèques de base NET (qui sont une implémentation de la norme NET)
Federico Dipuma
5
Ce diagramme est une aide fantastique pour illustrer la relation core / std / framework.
jaspe
Donc, si je crée une application console net461 et cible une bibliothèque netstandard2.0, rien de cette bibliothèque standard ne se résout dans l'application console. Alors... ??
Sinaesthetic
2
Une image vaut mille mots
Nikaas
182

.NET Core est une implémentation de .NET Standard. Il est disponible sur plusieurs systèmes d'exploitation, mais ce n'est pas la même chose - il existe également d'autres implémentations de .NET Standard.

Donc, si vous créez une bibliothèque .NET Core, elle aura accès aux éléments qui sont implémentés dans .NET Core, mais ne font pas partie de .NET Standard, et votre bibliothèque ne sera pas compatible avec d' autres implémentations de .NET Standard, tels que Xamarin, Tizen, framework de bureau .NET complet, etc.

En bref: pour obtenir une portabilité maximale, faites de votre bibliothèque une cible .NET Standard.

Jon Skeet
la source
5
@ ÁlvaroGarcía: Que voulez-vous dire par "ça" devrait être compatible? .NET Core 1.0? Pas nécessairement, car .NET Core 1.0 peut toujours inclure des éléments supplémentaires . Cette entrée signifie que si vous ciblez .NET Standard 1.6, vous pouvez exécuter le code sous Mono 4.6 et .NET Core 1.0.
Jon Skeet
4
Vous ne pouvez pas exécuter un assembly .NET Core sur autre chose que .NET Core (CoreCLR & CoreFX). Vous pouvez exécuter un assemblage .NET Standard sur n'importe quel framework répondant aux obligations contractuelles de la norme concernée (1.3, 1.6, 2.0, etc.).
Mark Rendle
2
La multiplateforme fait référence au système d'exploitation, pas au framework.
Mark Rendle
15
Par analogie, essayez d'imaginer .NET Standard comme une interface (par exemple INetStandard16). .NET Core 1.0 et Mono 4.6 implémentent tous les deux INetStandard16. Vous ne pouvez pas convertir .Net Core 1.0 en Mono 4.6 (et vice-versa), mais tout ce qui utilise INetStandard16fonctionnera sur les deux. (crédits à David Fowler )
Federico Dipuma
6
Cela m'a surpris. Les noms semblent à l'envers. On pourrait penser que quelque chose nommé "core" serait le plus minimal des deux ...
jpmc26
6

La bibliothèque de classes .NET Core est essentiellement un sous-ensemble de la bibliothèque .NET Framework, qui contient juste moins d'API. Le fait de s'en tenir à la bibliothèque de classes .NET Core rend difficile le partage de code entre les exécutions. Ce code peut ne pas fonctionner pour un runtime différent (Mono pour Xamarin), car il n'a pas l'API dont vous avez besoin. Pour résoudre ce problème, il existe .NET Standard, qui n'est qu'un ensemble de spécifications qui vous indique quelles API vous pouvez utiliser . L'objectif principal de .NET Standard est de partager du code entre les runtimes. Et il est important que cette spécification soit implémentée par tous les runtimes. (.NET Framework, .NET Core et Mono pour Xamarin).

Donc, si vous êtes sûr que vous n'utiliserez votre bibliothèque que pour des projets .NET Core, vous pouvez ignorer .NET Standard, mais s'il y a même une toute petite chance que votre code soit utilisé par .NET Framework ou Mono pour Xamarin, alors c'est mieux s'en tenir à la norme .NET

Notez également que les versions supérieures de .NET Standard contiennent plus d'API, mais les versions inférieures sont prises en charge par davantage de plates-formes. Par conséquent, si vous créez une bibliothèque .NET Standard que vous souhaitez partager entre les exécutions, ciblez la version la plus basse possible , ce qui vous aide à atteindre le plus de plates-formes. Par exemple, si vous souhaitez exécuter sur .NET Framework 4.5 et .NET Core 1.0, la version .NET Standard la plus élevée que vous pouvez utiliser est .NET Standard 1.1. Reportez-vous à ce grand tableau de la documentation pour plus d'informations à ce sujet.

PS: Aussi, si vous souhaitez convertir votre bibliothèque en .NET Standard, l'analyseur de portabilité .NET pourrait vous aider.

user2771704
la source
5

.NET Standard est une spécification des API .NET destinées à être disponibles sur les implémentations .NET. Cela permet de définir un ensemble uniforme d'API BCL pour toutes les implémentations .NET.

.NET Core est l'une de ces implémentations de .NET Standard. .NET Framework est une autre implémentation de .NET Standard.

Image du blog .NET

entrez la description de l'image ici

La réponse de Federicos vous donne un aperçu graphique de l'évolution de chaque framework avec les versions. Jetez un œil au diagramme ci-dessous de Microsoft Docs .

entrez la description de l'image ici

Le ciblage de .NET Standard augmente la prise en charge de votre plateforme tandis que le ciblage d'une plateforme .NET particulière telle que .NET Core (ou .NET Framework) vous permettra d'utiliser toutes les fonctionnalités de la plateforme pour cette plateforme.

Nipuna
la source
2

.NET Standard est une spécification d'API que toutes les implémentations .NET doivent fournir. Il apporte de la cohérence à la famille .NET et vous permet de créer des bibliothèques que vous pouvez utiliser à partir de n'importe quelle implémentation .NET. Il remplace les PCL pour la création de composants partagés.

.NET Core est une implémentation de .NET Standard optimisée pour la création d'applications de console, d'applications Web et de services cloud à l'aide d'ASP.NET Core. Son SDK est livré avec un puissant outil qui, en plus du développement Visual Studio, prend en charge un flux de travail de développement basé sur la ligne de commande complète. Vous pouvez en savoir plus à leur sujet sur aka.ms/netstandardfaq et aka.ms/netcore .


Ce qui précède, ainsi qu'une explication très claire de la plupart des éléments abordés dans cette question, peuvent être trouvés dans l'article extrêmement utile suivant de Microsoft (MSDN - septembre 2017): .NET Standard - Démystifier .NET Core et .NET Standard

steliosalex
la source
0

Voulez-vous dire .NET Framework? Parce que .NET standard est une implémentation, telle que .NET Framework, .NET Core et Xamarin.

J'adore .NET Core car nous pouvons l'héberger sur Linux (utiliser nginx dans mon expérience). Il est différent du framework .NET, que vous ne pouvez héberger que sur IIS. Vous pouvez considérer le budget d'hébergement dans ce cas (car le serveur Windows est cher pour moi).

Dans la perspective de l'environnement de développement , le noyau .Net est léger. Ainsi, vous pouvez utiliser VSCode, Sublime, pour IDE (pas seulement Visual Studio).

Fityan Aula
la source
0

En termes simples, la norme .NET est utilisée pour écrire des projets de bibliothèque de classes qui se compilent en DLL. .NET Core peut être utilisé pour développer des applications Web réelles qui peuvent s'exécuter sur tous les systèmes d'exploitation (Windows, Linux, MacOS). (Dans .NET Core 3, Microsoft a fourni la fonctionnalité pour développer des applications de bureau à l'aide de WPF, mais jusqu'à présent, ces applications ne seront pas multiplateformes et ne fonctionneront que sur le système Windows. À l'avenir, Microsoft pourrait également les rendre multiplateformes). Les bibliothèques / DLL peuvent être utilisées dans toute application utilisant .NET (.NET Framework, .NET Core), ce qui signifie que vous pouvez utiliser la norme .NET avec .NET Framework et .NET Core.

Waleed Naveed
la source