Escribir código conforme con CLS

Actualización: noviembre 2007

En general, la compatibilidad con Common Language Specification (CLS) 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 compatible con CLS o herramientas de programación compatibles con CLS, como un compilador. Las herramientas compatibles con CLS pueden ayudar a escribir código compatible con CLS.

Código compatible con CLS

Si desea que su código sea compatible con CLS, debe exponer la funcionalidad de manera que sea compatible con 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 compatible con CLS.

Nota:

La matrices escalonadas, es decir, matrices de matrices son compatibles con 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 compatibles o no compatibles con CLS mediante CLSCompliantAttribute. Todos los ensamblados que se desee que sean compatibles con CLS deben marcarse como tales. Un ensamblado que no se marque como compatible con CLS se considera que no es compatible con CLS. Si no se aplica ningún atributo de CLS a un tipo, se asume que ese tipo tiene la misma compatibilidad 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 compatibilidad con CLS que el tipo que lo define. No se puede marcar un elemento de programa como compatible con CLS si el elemento que lo encierra no está marcado como compatible con 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 compatibles con CLS incluso aunque algunas partes del ensamblado, módulo o tipo no sean compatibles con CLS, siempre y cuando se cumplan dos condiciones:

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

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

Si diseña una biblioteca de clases compatible con 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 compatible con CLS.

.NET Framework proporciona una biblioteca de clases compatible con CLS. Para obtener más información sobre el diseño de clases, vea Referencia de la biblioteca de clases de .NET Framework.

Herramientas compatibles con 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 compatibilidad con CLS al hacer que los tipos de datos y las características de CLS estén disponibles para crear componentes. Los niveles de compatibilidad con CLS entre los compiladores y otras herramientas se describen del modo siguiente:

  • Herramientas de consumidor compatibles con CLS.

    Las herramientas de consumidor son lenguajes que permiten a los programadores tener acceso a todas las características suministradas por las bibliotecas compatibles con CLS. Es posible que los programadores que usen estos lenguajes no puedan extender las bibliotecas compatibles con CLS mediante la creación de nuevos tipos, pero pueden usar cualquier tipo definido por una biblioteca compatible. El nivel de compatibilidad 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 compatibles con CLS.

    Las herramientas extensoras son lenguajes que permiten a los programadores usar y extender los tipos definidos en las bibliotecas compatibles con 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 (.

Cuando se diseñan componentes compatibles con CLS propios, puede ser útil emplear una herramienta compatible con CLS. Escribir componentes compatibles con 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 compatibles con CLS, como el compilador de C# o Visual Basic, permiten especificar que el código debe ser compatible con CLS. Estos compiladores pueden comprobar la compatibilidad 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 compatible con CLS, lo que hace que el compilador genere un error en tiempo de compilación si el código no es compatible con 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 compatibilidad del código con CLS, vea la documentación del compilador de lenguajes que esté utilizando.

Vea también

Conceptos

Información general acerca de la interoperabilidad de lenguajes

Otros recursos

Interoperabilidad entre lenguajes