Herança, a agregação e a contenção

Capacidade de reutilização de COM em de.NET Framework é realizado através de herança. Tipos COM podem participar de herança, como uma classe base. Use os modelos de herança, agregação ou confinamento nas seguintes circunstâncias:

Modelo

Use para

Herança

Expondo o objeto gerenciado como o objeto externo.

Agregação

Habilitando o objeto externo para expor a implementação do objeto de uma interface sem modificação.

Detenção

Habilitando o objeto externo modificar o comportamento do objeto interno.

Herança

Quando estão expostos interfaces gerenciadas COM, eles estendem sempre IUnknown ou IDispatch, mesmo quando a interface é herdada de outra interface no lado gerenciado. A mesma regra se aplica a interfaces de classe que são geradas para classes gerenciadas.

A.NET Framework estende o modelo de COM para reutilização, adicionando a herança de implementação. Tipos gerenciados derivam direta ou indiretamente de uma coclass COM; mais especificamente, eles podem ser obtidos com o runtime callable wrapper geradas pelo runtime. O tipo derivado pode expor todas método e as propriedades do objeto COM, bem como métodos e propriedades implementadas em código gerenciado. O objeto resultante é parcialmente implementado em código gerenciado e parcialmente implementado em código não gerenciado.

Para qualificar-se como uma classe base, o coclass deve:

Tipos gerenciados podem estender o RCW para uma coclass de qualificação e substituir os métodos fornecidos pelo objeto base. Se você desejar substituir qualquer um dos métodos, você deve substituir todos os métodos básicos de uma interface.

Um tipo gerenciado herda um RCW da mesma forma que ela herda a partir de um objeto gerenciado de base. No seguinte exemplo de código, o gerenciado Catapult classe deriva de AcmeLib.Slingshot, um tipo COM.

#using "AcmeLib.dll"    // Provides definition of Slingshot.

__gc class Catapult : public AcmeLib.Slingshot  // Extends the COM type.
{
    // Delegates to base implementation.
    Load() { //… };  
   
    Fire()               
    {
        // Engages in some behavior before delegating to the base 
        // implementation.
        Slingshot::Fire();
    }

    // The Aim method needs to be overridden.
    Aim() { //… }         
}
Catapult *cp = new Catapult();

// Calls derived implementation.
cp->Load();
// Calls base implementation.
cp->Aim();
// Calls derived which delegates to base.
cp->Fire();

Agregação

Para expor as interfaces de uma classe de COM, como se eles foram implementados em uma classe de COM a segunda, a segunda classe agrega o primeiro. Um objeto COM pode agregar um.NET object, no qual caso todas as interfaces do objeto, incluindo sua interface de classe, estão disponível através do objeto externo. Interno.NET object delega chamadas para seu IUnknown métodos para controlar o IUnknown.

Agregação é um pouco mais complexa do que o confinamento (descrito na próxima seção). Você geralmente usa-lo para ativar o objeto externo para expor a implementação do objeto de uma interface sem modificação. Todos os objetos gerenciados automaticamente suportam a agregação de estilo COM o objeto gerenciado que está sendo usado como o objeto interno. Agregar um objeto gerenciado, o objeto externo não gerenciado cria o objeto interno gerenciado chamando CoCreateInstance, e em seguida, passando o objeto externo IUnknown como um OuterUnknown parâmetro. Quando um externa IUnknown é passado para um objeto gerenciado durante a construção, o objeto gerenciado armazena em cache a interface e o usa como segue:

  • O objeto externo se mantiver a interno IUnknowndo nondelegating IUnknown. O nondelegating IUnknown se comporta como um normal IUnknown se comporta; ou seja, ele terá êxito se o objeto implementa a interface e falha caso contrário. O nondelegating IUnknown não encaminhar a chamada para o objeto externo.

  • Se o objeto interno é consultado para uma interface que não oferece suporte, o objeto interno delega a chamada para o objeto externo IUnknown interface.

  • Todas as chamadas para o QueryInterface, AddRef e Release métodos do objeto interno são delegados para o objeto externo IUnknown.

Esses três comportamentos tornam possível agregar qualquer objeto gerenciado. Com esse tipo de relação de agregação, é possível ter um único objeto COM parcialmente implementada no código gerenciado (a parte interna) e parcialmente no código não gerenciado (a parte externa).

Detenção

A.NET object pode conter um objeto COM importando seus metadados em um.NET assembly, em seguida, declarando um membro de dados desse tipo dentro de outra classe. Como ocorre com a detenção COM normal, você pode chamar os interfaces do objeto COM em suas próprias implementações de interface, mas o objeto contido não é exposto fora da classe. Confinamento é mais simples do que a agregação. Você normalmente usa o confinamento quando o objeto externo precisa modificar o comportamento do objeto interno. Para fazer isso, o objeto externo simplesmente cria uma instância do objeto interno em seu construtor e chamadas de delegados para o objeto interno, conforme necessário. O objeto externo pode escolher quais chamadas para delegar e quais chamadas para manipular diretamente. O tempo de execução não tem requisitos especiais para objetos oferecer suporte a contenção.

Um objeto COM também pode conter um.NET object. Comportamento com relação a clientes do objeto COM é exatamente o mesmo como se o objeto contido fosse qualquer outro objeto COM.

Consulte também

Conceitos

Expondo componentes COM para o.NET Framework

Expondo.NET Framework para COM

Outros recursos

Interoperabilidade de COM avançadas