Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Note
Este artigo é específico para .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O nonComVisibleBaseClass MDA (assistente de depuração gerenciada) é ativado quando uma QueryInterface chamada é feita por código nativo ou não gerenciado no CCW (wrapper callable) COM de uma classe gerenciada visível por COM que deriva de uma classe base que não é COM visível. A QueryInterface chamada faz com que o MDA seja ativado somente em casos em que a chamada solicita a interface de classe ou o padrão IDispatch da classe gerenciada visível por COM. O MDA não é ativado quando se destina a QueryInterface uma interface explícita que tem o ClassInterfaceAttribute atributo aplicado e é explicitamente implementado pela classe COM-visible.
Symptoms
Uma QueryInterface chamada feita a partir de código nativo que está falhando com um HRESULT COR_E_INVALIDOPERATION. O HRESULT pode ser devido ao runtime não permitir QueryInterface chamadas que causariam a ativação desse MDA.
Cause
O runtime não pode permitir QueryInterface chamadas para a interface de classe ou interface padrão IDispatch de uma classe COM visível que deriva de uma classe que não é comvisível devido a possíveis problemas de controle de versão. Por exemplo, se algum membro público tiver sido adicionado à classe base que não seja visível para COM, os clientes COM existentes usando a classe derivada poderão ser interrompidos porque a vtable da classe derivada, que contém os membros da classe base, seria alterada por essa alteração. As interfaces explícitas expostas ao COM não têm esse problema porque não incluem os membros base das interfaces na vtable.
Resolução
Não exponha a interface de classe. Defina uma interface explícita e aplique o ClassInterfaceAttribute atributo a ela.
Efeito no Runtime
Esse MDA não tem nenhum efeito sobre o CLR.
Saída
Veja a seguir uma mensagem de exemplo para uma QueryInterface chamada em uma classe Derived com visível que deriva de uma classe Basenão com visível.
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>