Partilhar via


MDA nonComVisibleBaseClass

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O nonComVisibleBaseClass assistente de depuração gerenciado (MDA) é ativado quando uma QueryInterface chamada é feita por código nativo ou não gerenciado no wrapper chamável COM (CCW) de uma classe gerenciada visível por COM que deriva de uma classe base que não é visível COM. A QueryInterface chamada faz com que o MDA seja ativado somente nos casos em que a chamada solicita a interface de classe ou o padrão IDispatch da classe gerenciada COM-visível. O MDA não é ativado quando o QueryInterface é para uma interface explícita que tem o ClassInterfaceAttribute atributo aplicado e é explicitamente implementado pela classe COM-visible.

Sintomas

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

Motivo

O tempo de execução não pode permitir QueryInterface chamadas para a interface de classe ou interface padrão IDispatch de uma classe COM-visible que deriva de uma classe que não é COM-visible devido a possíveis problemas de versionamento. Por exemplo, se algum membro público fosse adicionado à classe base que não é visível como COM, os clientes COM existentes usando a classe derivada poderiam potencialmente quebrar porque a vtable da classe derivada, que contém os membros da classe base, seria alterada por essa alteração. Interfaces explícitas expostas a COM não têm esse problema porque eles não incluem os membros base de interfaces no vtable.

Resolução

Não exponha a interface de classe. Defina uma interface explícita e aplique o ClassInterfaceAttribute atributo a ela.

Efeito no tempo de execução

Este MDA não tem efeito sobre o CLR.

Saída

A seguir está uma mensagem de exemplo para uma QueryInterface chamada em uma classe Derived COM-visible que deriva de uma classe Basenão-COM-visible .

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