nonComVisibleBaseClass MDA

Note

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 assistente nonComVisibleBaseClass de depuração gerido (MDA) é ativado quando uma QueryInterface chamada é feita por código nativo ou não gerido no wrapper chamável COM (CCW) de uma classe gerida COM-visível que deriva de uma classe base que não é visível COM. A QueryInterface chamada faz com que a MDA ative apenas nos casos em que a chamada solicita a interface da classe ou o padrão IDispatch da classe gerida visível COM. 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 chamada feita a partir de QueryInterface código nativo que está a falhar com um COR_E_INVALIDOPERATION HRESULT. O HRESULT pode dever-se ao tempo de execução permitir QueryInterface chamadas que causariam a ativação deste MDA.

Motivo

O runtime não pode permitir QueryInterface chamadas para a interface de classes ou interface padrão IDispatch de uma classe COM-visível que deriva de uma classe que não é COM-visível devido a potenciais problemas de versionamento. Por exemplo, se forem adicionados membros públicos à classe base que não seja COM-visible, clientes COM existentes que usem a classe derivada poderiam potencialmente falhar porque o vtable da classe derivada, que contém os membros da classe base, seria alterado por tal alteração. Interfaces explícitas expostas ao COM não têm este problema porque não incluem os membros base das interfaces no vtable.

Resolução

Não exponha a interface da 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 no CLR.

Output

Segue-se uma mensagem de exemplo para uma QueryInterface chamada numa 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>

Ver também