다음을 통해 공유


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

TypeName

DoNotUseAutoDualClassInterfaceType

CheckId

CA1408

범주

Microsoft.Interoperability

변경 수준

주요 변경

원인

COM(Component Object Model) 노출 형식은 ClassInterfaceType의 AutoDual 값으로 설정한 ClassInterfaceAttribute 특성으로 표시되어 있습니다.

규칙 설명

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

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

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 ClassInterfaceAttribute 특성의 값을 ClassInterfaceType의 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() {}
   }
}

관련 규칙

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

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

참고 항목

개념

클래스 인터페이스 소개

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

기타 리소스

비관리 코드와의 상호 운용