Написание CLS-совместимого кода

CLS-совместимость в общем означает соответствие правилам и ограничениям спецификации CLS. Однако у этого понятия есть более конкретное значение, которое зависит от того, к чему оно относится: к CLS-совместимому коду или CLS-совместимым средствам разработки, например компиляторам. CLS-совместимые средства служат для написания CLS-совместимого кода.

CLS-совместимый код

При создании CLS-совместимого кода предоставляемые в нем функции должны быть CLS-совместимы в следующих элементах:

  • в определениях общих классов;

  • в определениях общих членов общих классов и членов, доступных для производных классов (доступ уровня family).

  • в параметрах и возвращаемых типах общих методов общих классов, а также методов, доступных производным классам.

Функциональные возможности, используемые в определениях закрытых классов, в определениях закрытых методов общих классов и в локальных переменных, не обязательно должны соответствовать правилам CLS. Также можно использовать любые функциональные возможности языка в коде, реализующем класс, при этом компонент остается CLS-совместимым.

ПримечаниеПримечание

Массивы массивов являются CLS-совместимыми.В .NET Framework версии 1.0 компилятор C# ошибочно сообщает, что они не являются таковыми.

Сборки, модули, типы и члены можно отметить как CLS-совместимые или CLS-несовместимые с помощью атрибута CLSCompliantAttribute. Все сборки, которые создаются как CLS-совместимые, должны быть отмечены соответствующим образом. Сборка, не отмеченная как CLS-совместимая, рассматривается как CLS-несовместимая. Если к типу не применяются никакие атрибуты CLS, то подразумевается, что этот тип имеет такую же CLS-совместимость, как и сборка, в которой он определен. Аналогично, если к члену не применяются никакие атрибуты CLS, то предполагается, что он имеет ту же CLS-совместимость, что и тип, в котором он определен. Нельзя отметить элемент программы как CLS-совместимый, если включающий его элемент не отмечен как CLS-совместимый. В примере в конце этого раздела демонстрируется использование атрибута CLSCompliantAttribute.

Сборки, модули и типы могут быть CLS-совместимыми, даже если некоторые из их компонентов CLS-несовместимы, если соблюдаются два следующих условия.

  • Если элемент отмечен как CLS-совместимый, то его CLS-несовместимые составляющие, должны быть отмечены с помощью атрибута CLSCompliantAttribute со значением false.

  • Для каждого CLS-несовместимого члена должен быть предоставлен соответствующий CLS-совместимый альтернативный член.

CLS-совместимая библиотека классов будет гарантированно совместима с широким диапазоном языков программирования, таким образом, у этой библиотеки будет более широкий контингент пользователей, чем у CLS-несовместимой версии.

Платформа .NET Framework предоставляет CLS-совместимую библиотеку классов. Дополнительные сведения об этой библиотеке классов см. в разделе Библиотека классов платформы .NET Framework.

CLS-совместимые средства

Для языков, обращающихся к среде выполнения, имеется соглашение о поддержке функций CLS и соблюдении правил CLS, относящихся к компиляторам. Языковые компиляторы упрощают обеспечение CLS-совместимости, предоставляя доступ к типам данных и функциям CLS для создания компонентов. Существуют следующие уровни CLS-совместимости для компиляторов и других средств.

  • CLS-совместимые средства для пользователей

    Средства для пользователей — это языки, с помощью которых разработчики получают доступ ко всем возможностям, предоставляемым CLS-совместимыми библиотеками. Разработчики, использующие эти языки, не всегда имеют возможность расширять CLS-совместимые библиотеки, создавая новые типы, но могут использовать любые типы, определенные в совместимой библиотеке. Этот уровень совместимости используется при необходимости получить доступ к библиотеке классов .NET Framework, не создавая новых объектов, например при использовании Web Forms на странице ASP.NET или при создании пользовательского интерфейса Windows Forms.

  • CLS-совместимые средства для расширения

    Средства для расширения — это языки, в которых разработчики могут как использовать, так и расширять типы, определенные в CLS-совместимых библиотеках. Разработчики могут использовать существующие типы и определять новые. Средства для расширения должны соответствовать всем правилам, определенным для средств для пользователей, а также некоторым дополнительным правилам, которые описаны в спецификации для CLI, раздел I — 0 Архитектура, доступной на веб-сайте Microsoft Developer Network (MSDN).

При разработке собственных CLS-совместимых компонентов рекомендуется пользоваться CLS-совместимыми средствами. Разработка CLS-совместимых компонентов без таких средств более сложна, поскольку в этом случае, возможно, не удастся получить доступ ко всем необходимым функциям CLS.

Некоторые компиляторы CLS-совместимых языков, например компилятор C# или Visual Basic, позволяют указывать, разрабатывается ли код как CLS-совместимый. Такие компиляторы могут выполнять проверку на CLS-совместимость и уведомлять разработчика, когда в коде используются возможности, не поддерживаемые CLS. Компиляторы C# и Visual Basic позволяют отмечать элемент программы как CLS-совместимый, что приведет к ошибке времени компиляции, если код несовместим с CLS. Например, при компиляции следующего кода будет выдано предупреждение:

<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);
   }
}

Этот код порождает следующее предупреждение C#:

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

или следующее предупреждение Visual Basic:

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

Чтобы устранить это предупреждение, можно указать, что метод ChangeValue CLS-несовместим, как показано в следующем примере.

' 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);
   }
}

Этот код не порождает предупреждения компилятора. В результате получается 2.

Дополнительные сведения о способах задания CLS-совместимости для кода см. в документации по используемому языковому компилятору.

См. также

Основные понятия

Взаимная совместимость кодов на разных язык