다음을 통해 공유


AutoDual ClassInterfaceType을 사용하지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

범주

Microsoft.Interoperability

변경 수준

주요 변경

원인

COM에서 볼 수 있는 형식이 ClassInterfaceType.AutoDual로 설정된 System.Runtime.InteropServices.ClassInterfaceAttribute 특성으로 표시되어 있습니다.

규칙 설명

이중 인터페이스를 사용하는 형식에서는 클라이언트가 특정 인터페이스 레이아웃에 바인딩할 수 있습니다. 이후 버전에서 해당 형식이나 기본 형식의 레이아웃이 변경되면 인터페이스에 바인딩된 COM 클라이언트의 바인딩이 해제될 수 있습니다. 기본적으로 ClassInterfaceAttribute 특성이 지정되어 있지 않으면 디스패치 전용 인터페이스가 사용됩니다.

따로 표시되지 않은 경우 제네릭이 아닌 모든 public 형식은 COM에서 볼 수 있으며 public이 아닌 모든 제네릭 형식은 COM에서 볼 수 없습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 ClassInterfaceAttribute 특성의 값을 None으로 변경하고 인터페이스를 명시적으로 정의합니다.

경고를 표시하지 않는 경우

해당 형식과 기본 형식의 레이아웃이 이후 버전에서 확실하게 변경되지 않을 경우에만 이 규칙에서 경고를 표시하지 마십시오.

예제

다음 예제에서는 이 규칙을 위반하는 클래스와 명시적 인터페이스를 사용하도록 클래스를 다시 선언하는 방법을 보여 줍니다.

Imports System
Imports System.Runtime.InteropServices

<Assembly: ComVisibleAttribute(True)>
Namespace InteroperabilityLibrary

   ' This violates the rule.
   <ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _ 
   Public Class DualInterface
      Public Sub SomeSub
      End Sub
   End Class

   Public Interface IExplicitInterface
      Sub SomeSub
   End Interface

   <ClassInterfaceAttribute(ClassInterfaceType.None)> _ 
   Public Class ExplicitInterface
      Implements IExplicitInterface

      Public Sub SomeSub Implements IExplicitInterface.SomeSub
      End Sub

   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(true)]
namespace InteroperabilityLibrary
{
   // This violates the rule.
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class DualInterface
   {
      public void SomeMethod() {}
   }

   public interface IExplicitInterface
   {
      void SomeMethod();
   }

   [ClassInterface(ClassInterfaceType.None)]
   public class ExplicitInterface : IExplicitInterface
   {
      public void SomeMethod() {}
   }
}

관련 규칙

자동 레이아웃 형식은 COM 노출이면 안 됩니다.

ComSource 인터페이스를 IDispatch로 표시하십시오.

참고 항목

개념

클래스 인터페이스 소개

상호 운용할 .NET 형식의 정규화

기타 리소스

비관리 코드와의 상호 운용