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로 표시하십시오.