Écriture d'un code conforme CLS

La conformité CLS (Common Language Specification) désigne généralement le respect des règles et des restrictions CLS. Le concept possède toutefois une signification plus spécifique, selon que vous décrivez le code conforme CLS ou les outils de développement conformes CLS, tels qu'un compilateur. Les outils conformes CLS peuvent vous aider à écrire du code conforme CLS.

Code conforme CLS

Si vous souhaitez que votre code soit conforme CLS, vous devez exposer les fonctionnalités d'une manière qui soit conforme CLS dans les emplacements suivants :

  • définitions de vos classes publiques ;

  • définitions des membres publics des classes publiques et des membres accessibles aux classes dérivées (accès à la famille) ;

  • paramètres et types de retour des méthodes publiques des classes publiques et des méthodes accessibles aux classes dérivées.

Les fonctionnalités que vous utilisez dans les définitions de vos classes privées, dans les définitions de méthodes privées sur les classes publiques et dans les variables locales n'ont pas à suivre les règles CLS. Vous pouvez également utiliser toutes les fonctionnalités de langage que vous souhaitez dans le code qui implémente votre classe et toujours avoir un composant conforme CLS.

Notes

Les tableaux en escalier, c'est-à-dire les tableaux de tableaux, sont conformes CLS. Dans la version 1.0 du .NET Framework, le compilateur C# signale par erreur qu'ils ne le sont pas.

Vous pouvez marquer des assemblys, des modules, des types et des membres comme étant conformes CLS ou non conformes CLS à l'aide de CLSCompliantAttribute. Tous les assemblys qui sont destinés à être conformes CLS doivent être marqués en tant que tels. Un assembly qui n'est pas marqué comme étant conforme CLS est considéré comme étant non conforme CLS. Si aucun attribut CLS n'est appliqué à un type, ce type est considéré comme ayant la même conformité CLS que l'assembly dans lequel le type est défini. De la même façon, si aucun attribut CLS n'est appliqué à un membre, ce membre est considéré comme ayant la même conformité CLS que le type qui le définit. Vous ne pouvez pas marquer un élément de programme comme étant conforme CLS si son élément englobant n'est pas marqué comme étant conforme CLS. L'exemple donné à la fin de cette rubrique illustre l'utilisation de CLSCompliantAttribute.

Les assemblys, les modules et les types peuvent être conformes CLS, même si certains éléments de l'assembly, du module ou du type ne sont pas conformes CLS, à partir du moment où les deux conditions suivantes sont réunies :

  • Si l'élément est marqué comme étant conforme CLS, les parties non conformes CLS doivent être marquées à l'aide de CLSCompliantAttribute avec false affecté à son argument.

  • Un autre membre conforme CLS comparable doit être fourni pour chaque membre non conforme CLS.

Si vous concevez une bibliothèque de classes conforme CLS, elle sera assurée d'une interopérabilité avec de nombreux langages de programmation ; il est par conséquent vraisemblable qu'elle aura une base cliente plus large que celle d'une version non conforme CLS.

Le .NET Framework propose une bibliothèque de classes conforme CLS. Pour plus d'informations sur cette bibliothèque de classes, consultez Référence de la bibliothèque de classes .NET Framework.

Outils conformes CLS

Les langages qui ciblent le runtime ont accepté de prendre en charge les fonctionnalités CLS et de suivre les règles CLS dirigées vers les compilateurs. Ces compilateurs de langages simplifient la conformité CLS en rendant les types de données et les fonctionnalités CLS utilisables pour la création de composants. Les niveaux de conformité CLS des compilateurs et d'autres outils sont décrits ci-dessous :

  • Outils consommateurs conformes CLS.

    Les outils consommateurs sont des langages qui permettent aux développeurs d'accéder à toutes les fonctionnalités fournies par les bibliothèques conformes CLS. Les développeurs qui utilisent ces langages risquent de ne pas pouvoir étendre les bibliothèques conformes CLS en créant de nouveaux types, mais ils peuvent utiliser les types définis par une bibliothèque conforme. Ce niveau de conformité peut s'avérer utile lorsque vous souhaitez accéder à une bibliothèque de classes .NET Framework, mais ne nécessite pas la création de nouveaux objets pour la consommation par d'autres, dans les cas où vous utiliseriez Web Forms sur une page ASP.NET ou créeriez une interface utilisateur Windows Forms.

  • Outils extendeurs conformes CLS.

    Les outils extendeurs sont des langages qui permettent aux développeurs à la fois d'utiliser et d'étendre des types définis dans des bibliothèques conformes CLS. Les développeurs peuvent utiliser les types existants et définir de nouveaux types. Les outils extendeurs doivent suivre toutes les règles que les outils consommateurs doivent suivre, ainsi que d'autres règles qui sont décrites dans la spécification du Common Language Infrastructure, Partition I, qui se trouve sur MSDN, à l'adresse https://msdn.microsoft.com/net/ecma.

Lorsque vous concevez vos propres composants conformes CLS, il est utile d'utiliser un outil conforme CLS. L'écriture de composants conformes CLS sans cette prise en charge est plus difficile, car vous risquez de ne pas avoir accès à toutes les fonctionnalités CLS que vous souhaitez utiliser.

Certains compilateurs de langages conformes CLS, tels que les compilateurs C# ou Visual Basic, vous permettent de spécifier que vous souhaitez que votre code soit conforme CLS. Ces compilateurs vérifient la conformité CLS et vous indiquent lorsque votre code utilise des fonctionnalités qui ne sont pas prises en charge par la spécification CLS. Les compilateurs C# et Visual Basic vous permettent de marquer un élément de programme comme étant conforme CLS ; le compilateur générera par conséquent une erreur de compilation si le code n'est pas conforme CLS. Par exemple, le code C# suivant ne se compile pas.

using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time error results.
   public void ChangeValue(UInt32 value){ }
   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Ce code génère l'erreur suivante.

error: CS3001: Argument type 'uint' is not CLS-compliant.

Pour supprimer l'erreur, vous pouvez indiquer que ChangeValue n'est pas conforme, comme le montre l'exemple suivant.

using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
   // Method marked as not compliant.
   [CLSCompliantAttribute(false)]
   public void ChangeValue(UInt32 value){ }
   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Ce code ne produit pas d'erreurs de compilation. Le résultat est 2.

Pour plus d'informations sur la spécification de la conformité CLS de votre code, consultez la documentation du compilateur de langages que vous utilisez.

Voir aussi

Concepts

Vue d'ensemble de l'interopérabilité des langages

Autres ressources

Interopérabilité interlangage