Escribir código conforme con CLS

En general, la conformidad con CLS (Common Language Specification) hace referencia a la exigencia de que se sigan las reglas y restricciones de CLS. Sin embargo, el concepto tiene un significado más específico, dependiendo de si se está describiendo código conforme a CLS o herramientas de programación conformes a CLS, como un compilador. Las herramientas conformes a CLS pueden ayudar a escribir código conforme a CLS.

Código conforme a CLS

Si desea que su código sea conforme a CLS, debe exponer la funcionalidad de manera que sea conforme a CLS en los lugares siguientes:

  • Definiciones de clases públicas.

  • Definiciones de los miembros públicos de las clases públicas, y de los miembros accesibles por las clases derivadas (acceso family).

  • Parámetros y tipos devueltos de los métodos públicos de las clases públicas, y de los métodos accesibles para las clases derivadas.

No es necesario que cumplan las reglas de CLS las características que utilice en las definiciones de las clases privadas, en las definiciones de los métodos privados para las clases públicas y en las variables locales. También puede utilizar las características de lenguaje que desee en el código que implementa la clase y todavía tener un componente conforme a CLS.

NotaNota

La matrices escalonadas, es decir, matrices de matrices son conforme a CLS.En la versión 1.0 de .NET Framework, el compilador de C# informa erróneamente de que no lo son.

Se puede marcar ensamblados, módulos, tipos y miembros como conforme o no conforme a CLS mediante CLSCompliantAttribute. Todos los ensamblados que se desee que sean conformes a CLS deben marcarse como tales. Un ensamblado que no se marque como conforme a CLS se considera que no es conforme a CLS. Si no se aplica ningún atributo de CLS a un tipo, se asume que ese tipo tiene la misma conformidad con CLS que el ensamblado en el que se define el tipo. De manera similar, si no se aplica ningún atributo de CLS a un miembro, se considera que ese miembro tiene la misma conforme a CLS que el tipo que lo define. No se puede marcar un elemento de programa como conforme a CLS si el elemento que lo encierra no está marcado como conforme a CLS. En el ejemplo que aparece al final de este tema se ilustra el uso de CLSCompliantAttribute.

Los ensamblados, módulos y tipos pueden ser conformes a CLS incluso aunque algunas partes del ensamblado, módulo o tipo no sean conformes a CLS, siempre y cuando se cumplan dos condiciones:

  • Si el elemento se marca como conforme a CLS, las partes que no son conformes a CLS deben marcarse mediante CLSCompliantAttribute, estableciendo su argumento en false.

  • Para cada miembro que no sea conforme a CLS, se debe suministrar un miembro alternativo comparable que sea conforme a CLS.

Si diseña una biblioteca de clases conforme a CLS, se garantiza que la biblioteca será interoperable con una gran variedad de lenguajes de programación; por tanto, probablemente, la biblioteca tendrá una base de clientes más amplia que una versión que no sea conforme a CLS.

.NET Framework proporciona una biblioteca de clases conforme a CLS. Para obtener más información sobre esta biblioteca de clases, vea Biblioteca de clases de .NET Framework.

Herramientas conformes a CLS

Se ha acordado que los lenguajes dirigidos a Common Language Runtime admitan las características de CLS y sigan las reglas de CLS destinadas a los compiladores. Estos compiladores de lenguajes simplifican la conformidad con CLS al hacer que los tipos de datos y las características de CLS estén disponibles para crear componentes. Los niveles de conformidad con CLS entre los compiladores y otras herramientas se describen del modo siguiente:

  • Herramientas de consumidor conformes a CLS.

    Las herramientas de consumidor son lenguajes que permiten a los programadores tener acceso a todas las características suministradas por las bibliotecas conformes a CLS. Es posible que los programadores que usen estos lenguajes no puedan extender las bibliotecas conformes a CLS mediante la creación de nuevos tipos, pero pueden usar cualquier tipo definido por una biblioteca compatible. El nivel de conformidad puede ser de utilidad cuando se desea tener acceso a una biblioteca de clases de .NET Framework pero no se necesita crear nuevos objetos para el consumo de otros, como sucede cuando se usan los formularios Web Forms en una página ASP.NET o cuando se crea una interfaz de usuario de Windows Forms.

  • Herramientas extensoras conformes a CLS.

    Las herramientas extensoras son lenguajes que permiten a los programadores usar y extender los tipos definidos en las bibliotecas conformes a CLS. Los programadores pueden utilizar tipos existentes, así como definir tipos nuevos. Las herramientas extensoras deben cumplir todas las reglas que siguen las herramientas de consumidor, así como algunas reglas adicionales que se describen en la especificación de Common Language Infrastructure, Partition I - Architecture, disponible en el sitio web Microsoft Developer Network (MSDN).

Cuando se diseñan componentes conformes a CLS propios, puede ser útil emplear una herramienta conforme a CLS. Escribir componentes conformes a CLS sin esta ayuda es más difícil, ya que quizás no tenga acceso a todas las características de CLS que desee usar.

Algunos compiladores de lenguajes conformes a CLS, como el compilador de C# o Visual Basic, permiten especificar que el código debe ser conforme a CLS. Estos compiladores pueden comprobar la conformidad con CLS e informar de cuándo el código usa funcionalidad no admitida por CLS. Los compiladores de C# y Visual Basic permiten marcar un elemento de programa como conforme a CLS, lo que hace que el compilador genere un error en tiempo de compilación si el código no es conforme a CLS. Por ejemplo, el código siguiente genera una advertencia del compilador:

<Assembly: CLSCompliant(True)>

<CLSCompliant(True)> Public Class MyCompliantClass
   Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
using System;

// Assembly marked as compliant.
[assembly: CLSCompliant(true)]

// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time warning results.
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Este código genera la siguiente advertencia en C#:

warning CS3001: Argument type 'uint' is not CLS-compliant

o la siguiente advertencia en Visual Basic:

warning BC40028: Type of parameter 'value' is not CLS-compliant.

Para quitar la advertencia, puede indicar que ChangeValue no es compatible, como se muestra en el ejemplo siguiente.

' Assembly marked as compliant.
<Assembly: CLSCompliant(True)>

' Class marked as compliant.
<CLSCompliant(True)> Public Class MyCompliantClass
   ' Method marked as not compliant.
   <CLSCompliant(False)> Public Sub ChangeValue(value As UInt32)
   End Sub

   Public Shared Sub Main()
      Dim i As Integer = 2
      Console.WriteLine(i)
   End Sub   
End Class
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);
   }
}

Este código no genera ninguna advertencia del compilador. El resultado es 2

Para obtener más información sobre cómo especificar la conformidad del código con CLS, vea la documentación del compilador de lenguajes que esté utilizando.

Vea también

Conceptos

Interoperabilidad entre lenguajes