Compartilhar via


MDA nonComVisibleBaseClass

Observação

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

O MDA (Assistente de Depuração Gerenciado) de nonComVisibleBaseClass é ativado quando uma chamada QueryInterface é feita por código não gerenciado ou nativo no CCW (COM Callable Wrapper) de uma classe gerenciada visível em COM derivada de uma classe base que não é visível em COM. A chamada QueryInterface faz com que o MDA seja ativado apenas em casos nos quais a chamada solicita a interface de classe ou o IDispatch padrão da classe gerenciada visível em COM. O MDA não é ativado quando o QueryInterface é para uma interface explícita que tem o atributo ClassInterfaceAttribute aplicado e é implementado explicitamente pela classe visível em COM.

Sintomas

Uma chamada QueryInterface feita por meio do código nativo que está falhando com um HRESULT COR_E_INVALIDOPERATION. O HRESULT pode ser devido ao runtime não permitir chamadas QueryInterface que causariam a ativação desse MDA.

Causa

O runtime não pode permitir chamadas QueryInterface para a interface de classe ou a interface IDispatch padrão de uma classe visível em COM que deriva de uma classe não visível em COM devido a possíveis problemas de controle de versão. Por exemplo, se os membros públicos foram adicionados à a classe base que não é visível em COM, os clientes COM existentes usando a classe derivada podem ser interrompidos porque a vtable da classe derivada, que contém os membros da classe base, seria modificada por uma alteração desse tipo. Interfaces explícitas expostas a COM não têm esse problema porque elas não incluem os membros base das interfaces na vtable.

Resolução

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

Efeito sobre o runtime

Esse MDA não tem efeito sobre o CLR.

Saída

A seguir está um exemplo de mensagem para uma chamada QueryInterface em uma classe visível em COM Derived que deriva de uma classe não visível em COM 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>

Confira também