.NET Standard

.NET Standard est une spécification formelle des API .NET disponibles sur plusieurs implémentations .NET. La motivation derrière .NET Standard était d’établir une plus grande uniformité dans l’écosystème .NET. .NET 5 et versions ultérieures adoptent une approche différente pour établir l’uniformité qui élimine le besoin de .NET Standard dans la plupart des scénarios. Toutefois, si vous souhaitez partager du code entre .NET Framework et toute autre implémentation .NET, telle que .NET Core, votre bibliothèque doit cibler .NET Standard 2.0. Aucune nouvelle version de .NET Standard ne sera publiée, mais .NET 5, .NET 6 et toutes les versions ultérieures continueront de prendre en charge .NET Standard 2.1 et versions antérieures.

Pour plus d’informations sur le choix entre .NET 5+ et .NET Standard, consultez .NET 5+ et .NET Standard plus loin dans cet article.

Versions de .NET Standard

.NET Standard est versionné. Chaque nouvelle version ajoute d’autres API. Lorsqu’une bibliothèque est créée sur une certaine version de .NET Standard, elle peut s’exécuter sur n’importe quelle implémentation .NET qui implémente cette version de .NET Standard (ou ultérieure).

Le ciblage d’une version supérieure de .NET Standard permet à une bibliothèque d’utiliser davantage d’API, mais signifie qu’elle ne peut être utilisée que sur des versions plus récentes de .NET. Le ciblage d’une version inférieure réduit les API disponibles, mais signifie que la bibliothèque peut s’exécuter dans plus d’emplacements.

Sélectionner la version .NET Standard

.NET Standard 1.0 a 7 949 des 37 118 API disponibles.

Implémentation de .NET Prise en charge de la version
.NET et .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
Plateforme Windows universelle 8.0, 8.1, 10.0, 10.0.16299, À déterminer
Unity 2018.1

Pour plus d’informations, consultez .NET Standard 1.0. Pour un tableau interactif, consultez Versions .NET Standard.

Version de .NET Standard à cibler

Nous vous recommandons de cibler .NET Standard 2.0, sauf si vous devez prendre en charge une version antérieure. La plupart des bibliothèques à usage général ne devraient pas avoir besoin d’API en dehors de .NET Standard 2.0. .NET Standard 2.0 est pris en charge par toutes les plateformes modernes et constitue la méthode recommandée pour prendre en charge plusieurs plateformes avec une cible.

Si vous devez prendre en charge .NET Standard 1.x, nous vous recommandons de cibler également .NET Standard 2.0. .NET Standard 1.x est distribué sous la forme d’un ensemble précis de packages NuGet, qui crée un grand graphique des dépendances de package et amène les développeurs à télécharger un grand nombre de packages lors de la génération. Pour plus d’informations, consultez Ciblage multiplateforme et .NET 5+ et .NET Standard plus loin dans cet article.

Règles de contrôle de version de .NET standard

Il existe deux règles principales de contrôle de version :

  • Additive : les versions de .NET Standard sont des cercles logiquement concentriques : les versions plus élevées intègrent toutes les API des versions précédentes. Il n’y a pas de ruptures entre les versions.
  • Immuable : une fois livrées, les versions de .NET Standard sont figées.

Il n’y aura aucune nouvelle version de .NET Standard après la version 2.1. Pour plus d’informations, consultez .NET 5+ et .NET Standard plus loin dans cet article.

Caractéristique

La spécification de .NET Standard est un ensemble d’API normalisé. La spécification est gérée par les implémenteurs .NET, en particulier Microsoft (y compris .NET Framework, .NET Core et Mono) et Unity.

Artefacts officiels

La spécification officielle est un ensemble de fichiers .cs qui définissent les API qui font partie de la norme. Le répertoire ref dans le référentiel dotnet/standard (maintenant archivé) définit les API .NET Standard.

Le métapackage NETStandard.Library (source) décrit l’ensemble des bibliothèques qui définissent (en partie) une ou plusieurs versions de .NET Standard.

Un composant donné, comme System.Runtime, décrit :

  • Une partie de .NET Standard (seulement son étendue).
  • Plusieurs versions de .NET Standard, pour cette étendue.

Des artefacts dérivés sont fournis pour une lecture plus pratique et pour activer certains scénarios de développement (par exemple, utilisation d’un compilateur).

Représentation des packages

Les assemblys de référence de .NET Standard sont distribués principalement via les packages NuGet. Les implémentations sont fournies de façons différentes, en fonction de l’implémentation de .NET.

Les packages NuGet ciblent un ou plusieurs frameworks. Les packages .NET Standard ciblent l’infrastructure .NET Standard. Vous pouvez cibler le .NET Framework Standard avec le Moniker de framework cible compactnetstandard (par exemple netstandard1.4). Les bibliothèques destinées à s’exécuter sur plusieurs implémentations de .NET doivent cibler ce framework. Pour l’ensemble d’API le plus large, ciblez netstandard2.0, car le nombre d’API disponibles a plus que doublé entre .NET Standard 1.6 et 2.0.

Le métapackage NETStandard.Library référence l’ensemble complet des packages NuGet qui définissent .NET Standard. La méthode la plus courante pour cibler netstandard consiste à référencer ce métapackage. Il décrit et donne accès à la quarantaine de bibliothèques .NET et les API associées qui définissent .NET Standard. Vous pouvez référencer d’autres packages qui ciblent netstandard pour avoir accès à d’autres API.

Gestion de version

La spécification n’est pas unique, mais un ensemble d’API avec version linéaire. La première version de la norme établit un ensemble d’API de référence. Les versions ultérieures ajoutent des API et héritent des API définies par les versions précédentes. Il n’existe aucune provision établie pour la suppression des API de la norme.

.NET Standard n’est spécifique à aucune implémentation de .NET, et ne correspond pas non plus au schéma de contrôle de version de l’une de ces implémentations.

Comme indiqué précédemment, il n’y aura aucune nouvelle version de .NET Standard après la version 2.1.

Ciblez .NET Standard

Vous pouvez générer des bibliothèques .NET Standard à l’aide netstandard d’une combinaison du framework et du NETStandard.Library métapackage.

Mode de compatibilité du .NET Framework

Le mode de compatibilité du .NET Framework a été introduit dans .NET Standard 2.0. Ce mode de compatibilité permet aux projets .NET Standard de référencer des bibliothèques .NET Framework comme si elles étaient compilées pour .NET Standard. Le référencement de bibliothèques .NET Framework ne fonctionne pas pour tous les projets, par exemple pour les bibliothèques qui utilisent des API WPF (Windows Presentation Foundation).

Pour plus d’informations, consultez Mode de compatibilité du .NET Framework.

Bibliothèques .NET Standard et Visual Studio

Pour générer des bibliothèques .NET Standard dans Visual Studio, vérifiez que Visual Studio 2022, Visual Studio 2019 ou Visual Studio 2017 version 15.3 ou ultérieure est installé sur Windows, ou Visual Studio pour Mac version 7.1 ou ultérieure sur macOS.

Si vous devez seulement utiliser les bibliothèques .NET Standard 2.0 dans vos projets, vous pouvez également le faire dans Visual Studio 2015. Cependant, le client NuGet 3.6 ou ultérieur doit être installé. Vous pouvez télécharger le client NuGet pour Visual Studio 2015 à partir de la page Téléchargements NuGet.

.NET 5+ et .NET Standard

.NET 5 et .NET 6 sont des produits uniques avec un ensemble uniforme de fonctionnalités et d’API qui peuvent être utilisées pour les applications de bureau Windows et les applications console multiplateformes, les services cloud et les sites web. Les TPM .NET 5, par exemple, reflètent ce large éventail de scénarios :

  • net5.0

    Ce TFM est destiné au code qui s’exécute partout. À quelques exceptions près, il inclut uniquement les technologies qui fonctionnent multiplateforme. Pour le code .NET 5, net5.0 remplace à la fois netcoreapp et netstandard les machines tfms.

  • net5.0-windows

    Il s’agit d’un exemple de TFM spécifique au système d’exploitation qui ajoute des fonctionnalités spécifiques au système d’exploitation à tout ce qui net5.0 fait référence à.

Quand cibler net5.0 ou net6.0 par rapport à netstandard

Pour le code existant qui cible netstandard, il n’est pas nécessaire de modifier le TFM en net5.0 ou net6.0. .NET 5 et .NET 6 implémentent .NET Standard 2.1 et versions antérieures. La seule raison de recibler de .NET Standard vers .NET 5+ serait d’accéder à davantage de fonctionnalités d’exécution, de fonctionnalités de langage ou d’API. Par exemple, pour utiliser C# 9, vous devez cibler .NET 5 ou une version ultérieure. Vous pouvez multi-recibler .NET 5 ou .NET 6 et .NET Standard pour accéder à des fonctionnalités plus récentes tout en ayez toujours votre bibliothèque disponible pour d’autres implémentations .NET.

Voici quelques instructions pour le nouveau code pour .NET 5+:

  • Composants de l’application

    Si vous utilisez des bibliothèques pour décomposer une application en plusieurs composants, nous vous recommandons de cibler net5.0 ou net6.0. Par souci de simplicité, il est préférable de conserver tous les projets qui composent votre application sur la même version de .NET. Vous pouvez ensuite supposer les mêmes fonctionnalités BCL partout.

  • Bibliothèques réutilisables

    Si vous créez des bibliothèques réutilisables que vous prévoyez d’expédier sur NuGet, envisagez le compromis entre reach et l’ensemble de fonctionnalités disponibles. .NET Standard 2.0 étant la dernière version prise en charge par .NET Framework, il offre une bonne portée avec un ensemble de fonctionnalités assez volumineux. Nous vous déconseillons de cibler .NET Standard 1.x, car vous limiteriez l’ensemble de fonctionnalités disponibles pour une augmentation minimale de la portée.

    Si vous n’avez pas besoin de prendre en charge .NET Framework, vous pouvez utiliser .NET Standard 2.1 ou .NET 5/6. Nous vous recommandons d’ignorer .NET Standard 2.1 et de passer directement à .NET 6. Les bibliothèques les plus largement utilisées ciblent à la fois pour .NET Standard 2.0 et .NET 5+. La prise en charge de .NET Standard 2.0 vous offre la plus grande portée, tandis que la prise en charge de .NET 5+ vous permet de tirer parti des dernières fonctionnalités de plateforme pour les clients qui sont déjà sur .NET 5+.

Problèmes .NET Standard

Voici quelques problèmes liés à .NET Standard qui expliquent pourquoi .NET 5 et versions ultérieures sont le meilleur moyen de partager du code entre les plateformes et les charges de travail :

  • Lenteur à ajouter de nouvelles API

    .NET Standard a été créé en tant qu’ensemble d’API que toutes les implémentations de .NET doivent prendre en charge. Un processus d’examen a donc été mis en place pour les propositions d’ajout de nouvelles API. L’objectif était de standardiser uniquement les API qui pouvaient être implémentées dans toutes les plateformes .NET actuelles et futures. Le résultat était que si une fonctionnalité ne parvenait pas à une version particulière, vous devrez peut-être attendre quelques années avant qu’elle soit ajoutée à une version du Standard. Ensuite, vous attendriez encore plus longtemps que la nouvelle version de .NET Standard soit largement prise en charge.

    Solution dans .NET 5+: Lorsqu’une fonctionnalité est implémentée, elle est déjà disponible pour chaque bibliothèque et application .NET 5+, car la base de code est partagée. Et comme il n’y a aucune différence entre la spécification de l’API et son implémentation, vous pouvez tirer parti des nouvelles fonctionnalités beaucoup plus rapidement qu’avec .NET Standard.

  • Contrôle de version complexe

    La séparation de la spécification de l’API de ses implémentations entraîne un mappage complexe entre les versions de spécification d’API et les versions d’implémentation. Cette complexité est évidente dans le tableau présenté plus haut dans cet article et dans les instructions pour l’interpréter.

    Solution dans .NET 5+: Il n’existe aucune séparation entre une spécification d’API .NET 5+ et son implémentation. Le résultat est un schéma TFM simplifié. Il existe un préfixe TFM pour toutes les charges de travail : net5.0 ou net6.0 est utilisé pour les bibliothèques, les applications console et les applications web. La seule variante est un suffixe qui spécifie des API spécifiques à la plateforme pour une plateforme particulière, telle que net5.0-windows ou net6.0-windows. Grâce à cette convention d’affectation de noms TFM, vous pouvez facilement déterminer si une application donnée peut utiliser une bibliothèque donnée. Aucune table d’équivalents de numéro de version, comme celle de .NET Standard, n’est nécessaire.

  • Exceptions non prises en charge par la plateforme au moment de l’exécution

    .NET Standard expose des API spécifiques à la plateforme. Votre code peut être compilé sans erreur et semble être portable sur n’importe quelle plateforme, même s’il n’est pas portable. Quand il s’exécute sur une plateforme qui n’a pas d’implémentation pour une API donnée, vous obtenez des erreurs d’exécution.

    Solution dans .NET 5+: Les sdk .NET 5+ incluent des analyseurs de code qui sont activés par défaut. L’analyseur de compatibilité de plateforme détecte l’utilisation involontaire d’API qui ne sont pas prises en charge sur les plateformes sur lesquelles vous envisagez de s’exécuter. Pour plus d’informations, consultez Analyseur de compatibilité de plateforme.

.NET Standard non déconseillé

.NET Standard est toujours nécessaire pour les bibliothèques qui peuvent être utilisées par plusieurs implémentations .NET. Nous vous recommandons de cibler .NET Standard dans les scénarios suivants :

  • Permet netstandard2.0 de partager du code entre .NET Framework et toutes les autres implémentations de .NET.
  • Utilisez netstandard2.1 pour partager du code entre Mono, Xamarin et .NET Core 3.x.

Voir aussi