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 Base
nã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>