다음을 통해 공유


CLS 규격 코드 작성

CLS(공용 언어 사양) 규격이란 일반적으로 CLS의 규칙 및 제한이 적용되는지 여부를 의미합니다. 그러나 이 개념은 CLS 규격 코드나 CLS 규격 개발 도구(예: 컴파일러) 중 어느 것에 대한 설명인지에 따라 그 의미가 다릅니다. CLS 규격 도구를 사용하면 CLS 규격 코드를 작성할 수 있습니다.

CLS 규격 코드

CLS 규격 코드를 작성하려면, 다음의 작업에서 CLS 규격 기능을 노출시켜야 합니다.

  • 공용 클래스 정의

  • 공용 클래스의 공용 멤버에 대한 정의 및 파생 클래스에서 액세스할 수 있는 멤버에 대한 정의(family 액세스)

  • 공용 클래스의 공용 메서드에 대한 매개 변수 및 반환 형식 또는 파생 클래스에서 액세스할 수 있는 메서드에 대한 매개 변수 및 반환 형식

전용 클래스 정의, 공용 클래스의 전용 메서드 정의 및 지역 변수 정의에 사용하는 기능은 CLS 규칙을 따르지 않아도 됩니다. 또한 클래스를 구현하는 코드를 작성할 때 CLS 규칙을 따르지 않는 언어 기능을 사용하더라도 그 안에 CLS 규격 구성 요소가 포함될 수 있습니다.

참고참고

가변 배열(즉, 배열의 배열)은 CLS 규격입니다..NET Framework 버전 1.0의 C# 컴파일러에서는 가변 배열이 CLS 규격이 아닌 것으로 잘못 보고됩니다.

CLSCompliantAttribute를 사용하여 어셈블리, 모듈, 형식 및 멤버가 CLS 규격인지 여부를 표시할 수 있습니다. CLS 규격 어셈블리는 반드시 CLS 규격인 것으로 표시되어야 합니다. CLS 규격으로 표시되지 않은 어셈블리는 자동으로 CLS 규격이 아닌 것으로 간주됩니다. CLS 특성이 적용되지 않은 형식은 해당 형식이 정의된 어셈블리와 동일한 CLS 규격인 것으로 간주됩니다. 마찬가지로, CLS 특성이 적용되지 않은 멤버도 해당 멤버를 정의하는 형식과 동일한 CLS 규격인 것으로 간주됩니다. 특정 프로그램 요소의 포함 요소가 CLS 규격이 아닌 경우에는 해당 프로그램 요소를 CLS 규격으로 표시할 수 없습니다. CLSCompliantAttribute를 사용하는 방법은 이 항목의 끝에 나오는 예제에서 설명됩니다.

어셈블리, 모듈 및 형식의 일부가 CLS 규격이 아니더라도 다음 두 조건이 만족되면 이들 어셈블리, 모듈 또는 형식은 CLS 규격이 될 수 있습니다.

  • 요소가 CLS 규격으로 표시되면 CLSCompliantAttribute의 인수를 false로 설정하여 CLS 규격이 아닌 부분을 표시해야 하는 경우

  • CLS 규격이 아닌 각 멤버에 대해 CLS 규격인 대체 멤버를 제공해야 하는 경우

CLS 규격 클래스 라이브러리를 디자인하면, 해당 라이브러리는 여러 종류의 프로그래밍 언어에서 상호 운용될 수 있기 때문에 CLS 규격이 아닌 라이브러리 버전보다 더 많은 고객층에서 사용될 수 있습니다.

.NET Framework에서 제공하는 클래스 라이브러리는 CLS 규격입니다. 이 클래스 라이브러리에 대한 자세한 내용은 .NET Framework 클래스 라이브러리를 참조하십시오.

CLS 규격 도구

런타임을 목적으로 하는 모든 언어에서는 CLS 기능을 지원하고 해당 컴파일러에서 CLS 규칙을 따릅니다. 이들 언어 컴파일러는 구성 요소를 만들 수 있는 CLS 데이터 형식 및 기능을 제공하여 CLS 규격을 단순화합니다. 각 컴파일러 및 도구에서 지원하는 CLS 규격 수준은 다음과 같습니다.

  • CLS 규격 소비자 도구

    소비자 도구는 개발자가 CLS 규격 라이브러리에서 제공되는 모든 기능에 액세스할 수 있게 하는 언어입니다. 이들 언어를 사용하는 개발자는 CLS 규격 라이브러리에 정의된 모든 형식을 사용할 수 있지만, 새 형식을 만들어 CLS 규격 라이브러리를 확장할 수는 없습니다. 이러한 수준의 CLS 규격은 ASP.NET 페이지에서 Web Forms을 사용하거나 Windows Forms 사용자 인터페이스를 만들 때와 같이 다른 사람이 사용할 수 있는 새 개체를 만드는 것이 아니고 단지 .NET Framework 클래스 라이브러리에 액세스만 하는 경우에 유용합니다.

  • CLS 규격 확장자 도구

    확장자 도구는 CLS 규격 라이브러리에 정의된 형식을 개발자가 사용하거나 확장할 수 있게 하는 언어입니다. 개발자는 기존 형식을 사용하는 것은 물론 새 형식을 정의할 수도 있습니다. 확장자 도구에는 소비자 도구에 적용되는 모든 규칙과 함께 몇 가지 추가 규칙이 적용됩니다. 추가 규칙은 MSDN(Microsoft Developer Network) 웹 사이트에서 제공하는 Common Language Infrastructure, Partition I - Architecture의 사양에 설명되어 있습니다.

CLS 규격 도구를 사용하면 CLS 규격 구성 요소를 쉽게 디자인할 수 있습니다. 이러한 도구를 전혀 사용하지 않으면 사용하려는 CLS 기능을 모두 액세스하지 못할 수도 있으므로 작업하는 데 어려움이 있을 수 있습니다.

C# 또는 Visual Basic 컴파일러를 비롯한 일부 CLS 규격 언어 컴파일러에서는 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 규격 준수 여부를 지정하는 방법에 대한 자세한 내용은 현재 사용하는 언어 컴파일러에 대한 설명서를 참조하십시오.

참고 항목

개념

언어 간 상호 운용성