다음을 통해 공유


nonComVisibleBaseClass MDA

COM 노출이 아닌 기본 클래스에서 파생되는 COM 노출 관리 클래스의 CCW(COM 호출 가능 래퍼)에서 네이티브 코드나 비관리 코드에 의해 QueryInterface가 호출되는 경우 nonComVisibleBaseClass MDA(관리 디버깅 도우미)가 활성화됩니다. QueryInterface를 호출하면 호출이 COM 노출 관리 클래스의 클래스 인터페이스나 기본 IDispatch를 요청하는 경우에만 MDA가 활성화됩니다. QueryInterfaceClassInterfaceAttribute 특성이 적용되어 있고 COM 노출 클래스에 의해 명시적으로 구현되는 명시적 인터페이스용인 경우 MDA는 활성화되지 않습니다.

증상

COR_E_INVALIDOPERATION HRESULT 값과 함께 오류가 발생하는 네이티브 코드에서 QueryInterface가 호출되었습니다. HRESULT의 원인은 이 MDA를 활성화시키는 QueryInterface 호출을 허용하지 않는 런타임 때문일 수 있습니다.

원인

런타임은 버전 관리 문제로 인해 COM 노출이 아닌 클래스에서 파생되는 COM 노출 클래스의 클래스 인터페이스나 기본 IDispatch 인터페이스에 대해 QueryInterface 호출을 허용할 수 없습니다. 예를 들어, COM 노출이 아닌 기본 클래스에 공용 멤버를 추가하면 기본 클래스 멤버가 들어 있는 파생 클래스의 vtable이 이에 따라 변경되므로 해당 파생 클래스를 사용하는 기존 COM 클라이언트가 중단될 가능성이 있습니다. COM에 노출되는 명시적 인터페이스의 경우 vtable에 인터페이스의 기본 멤버가 포함되지 않으므로 이러한 문제가 없습니다.

해결 방법

클래스 인터페이스를 노출하지 마십시오. 명시적 인터페이스를 정의하고 ClassInterfaceAttribute 특성을 적용합니다.

런타임 효과

이 MDA는 CLR에 아무런 영향을 주지 않습니다.

Output

다음 예제는 COM 노출 클래스가 아닌 Base에서 파생되는 COM 노출 클래스 Derived에서 QueryInterface 호출에 대한 메시지입니다.

A QueryInterface call was made requesting the class interface of COM 
visible managed class 'Derived'. However since this class derives from 
non COM visible class 'Base', the QueryInterface call will fail. This 
is done to prevent the non COM visible base class from being 
constrained by the COM versioning rules. 

구성

<mdaConfig>
  <assistants>
    <nonComVisibleBaseClass />
  </assistants>
</mdaConfig>

참고 항목

참조

MarshalAsAttribute

개념

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

Interop 마샬링

기타 리소스

상호 운용성