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>