Compartilhar via


nonComVisibleBaseClass MDA

O nonComVisibleBaseClass Assistente de depuração gerenciada (MDA) é ativado quando uma QueryInterface chamada é feita pelo código nativo ou gerenciado no invólucro (CCW) de uma classe COM visíveis gerenciado que deriva da classe base que não é visível em COM. O QueryInterface chamada faz com que o MDA ativar somente em casos onde a chamada solicita a interface de classe ou o padrão IDispatch do COM-visível gerenciado classe. O MDA não é ativado quando o QueryInterface é uma interface explícita que tem o ClassInterfaceAttribute atributo aplicado e é implementado explicitamente por visível para COM a classe.

Sintomas

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

Causa

O tempo de execução não pode permitir que QueryInterface chamadas para a interface de classe ou um padrão IDispatch interface de uma classe COM visíveis que deriva de uma classe que é não visível em COM causa de possíveis problemas de versionamento. Por exemplo, se os membros públicos foram adicionados à classe base que não é visível em COM, os clientes COM existentes usando a classe derivada puderam interromper porque o vtable derivados da classe, que contém os membros da classe base, seria alterado por tal alteração. Interfaces explícitas expostos a COM não terá esse problema, porque elas não incluem os membros de base das interfaces do vtable.

Resolução

Não exponha a interface de classe. Definir uma interface explícita e aplicar o ClassInterfaceAttribute atributo para o proprietário.

Efeito sobre o tempo de execução.

Este MDA não tem efeito sobre o CLR.

Saída

A seguir está um exemplo de mensagem para um QueryInterface ligar uma classe visível em COM 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

Referência

MarshalAsAttribute

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada

Interop Marshaling

Outros recursos

Interoperabilidade