Compartilhar via


nonComVisibleBaseClass MDA

The nonComVisibleBaseClass Assistente de depuração gerenciada (MDA) é ativado quando um QueryInterface telefonar é feita pelo código nativo ou não gerenciado no COM callable wrapper (CCW) de uma classe COM visibilidade gerenciado que deriva de uma classe base que não está visível COM. The QueryInterface telefonar faz com que o MDA ativar somente em casos onde telefonar solicita a interface de classe ou padrão IDispatch do COM-visível gerenciado classe. O MDA não é ativado quando o QueryInterface é para uma interface explícita com o ClassInterfaceAttribute atributo aplicado e explicitamente é implementado pela classe COM visível.

Sintomas

A QueryInterface telefonar feita a partir do código nativo que está falhando com um HRESULT COR_E_INVALIDOPERATION. O HRESULT pode ser devido a tempo de execução não permitindo QueryInterface chamadas que faria com que a ativação deste MDA.

Causa

O tempo de execução não pode permitir que QueryInterface chamadas para a interface de classe ou padrão IDispatch interface de uma classe COM visível que deriva de uma classe que não é COM visível devido às possíveis problemas de controle de controle de versão. Por exemplo, se os membros públicos foram adicionados a classe base que não esteja visível de COM, existentes COM os clientes que usam a classe derivada potencialmente pode ser desfeito porque vtable derivados da classe, que contém os membros da classe base, seria alterado por essa alterar.Interfaces explícitas expostos a COM não tem esse problema porque elas não incluem os membros básicos de interfaces de vtable.

Resolução

Não exponha a interface de classe.Definir uma interface explícita e aplicar o ClassInterfaceAttribute o atributo a ele.

Efeito sobre o tempo de execução

Este MDA não tem efeito sobre o CLR.

Saída

A seguir é uma mensagem de exemplo para um QueryInterface chamar em uma classe COM visível Derived que deriva de uma classe COM visível Base.

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. 

Configuração

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

Consulte também

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Visão geral do empacotamento interop

Referência

MarshalAsAttribute

Outros recursos

Interoperabilidade