다음을 통해 공유


dirtyCastAndCallOnInterface MDA

런타임 바인딩 전용으로 표시된 클래스 인터페이스에서 vtable을 통해 초기 바인딩된 호출이 시도되면 dirtyCastAndCallOnInterface MDA(관리 디버깅 도우미)가 활성화됩니다.

증상

COM을 통해 초기 바인딩된 호출을 CLR에 저장할 때 응용 프로그램에서 액세스 위반이 throw되거나 예기치 않은 동작이 발생합니다.

원인

코드에서 런타임 바인딩 전용인 클래스 인터페이스를 통해 vtable을 통한 초기 바인딩 호출을 시도하고 있습니다. 기본적으로 클래스 인터페이스는 런타임 바인딩 전용으로 식별됩니다. 또한 ClassInterfaceAttribute 특성 값이 AutoDispatch([ClassInterface(ClassInterfaceType.AutoDispatch)])인 런타임 바인딩으로 식별될 수 있습니다.

해결 방법

권장하는 해결 방법은 COM이 사용할 명시적인 인터페이스를 정의하고 COM 클라이언트가 자동 생성 클래스 인터페이스 대신 이 인터페이스를 통해 호출하도록 하는 것입니다. 또는 COM의 호출을 IDispatch를 통해 런타임에 바인딩되는 호출로 변환할 수 있습니다.

마지막으로 클래스를 AutoDual([ClassInterface(ClassInterfaceType.AutoDual)])로 식별하여 초기 바인딩되는 호출을 COM에서 수행할 수 있습니다. 하지만 ClassInterfaceAttribute에 설명된 버전 관리 제한 때문에 AutoDual은 사용하지 않는 것이 좋습니다.

런타임 효과

이 MDA는 CLR에 아무런 영향을 주지 않습니다. 런타임에 바인딩되는 인터페이스에서의 초기 바인딩 호출에 대한 데이터만 보고합니다.

Output

초기에 바인딩되어 액세스되는 필드 이름 또는 메서드 이름입니다.

구성

<mdaConfig>
  <assistants>
    <dirtyCastAndCallOnInterface />
  </assistants>
</mdaConfig>

참고 항목

참조

ClassInterfaceAttribute

개념

관리 디버깅 도우미를 사용하여 오류 진단

기타 리소스

상호 운용성