Share via


Herencia, agregación y almacenamiento

La reutilización de COM en .NET Framework se consigue mediante la herencia. Los tipos COM pueden participar en la herencia como una clase base. Use los modelos de herencia, agregación o almacenamiento en las circunstancias siguientes:

Modelo

Se utiliza para

Herencia

Exponer el objeto administrado como objeto externo.

Agregación

Permitir que el objeto externo exponga la implementación de una interfaz de otro objeto sin modificaciones.

Almacenamiento

Permitir que el objeto externo modifique el comportamiento del objeto interno.

Herencia

Cuando las interfaces administradas se exponen a COM, siempre extienden IUnknown o IDispatch, incluso si la interfaz se hereda de otra interfaz en el lado administrado. La misma regla se aplica a las interfaces de clase que se generan para las clases administradas.

.NET Framework extiende el modelo COM de reutilización agregando la herencia de implementación. Los tipos administrados se pueden derivar directa o indirectamente de una coclase COM, se pueden derivar del contenedor invocable en tiempo de ejecución que genera el motor en tiempo de ejecución. El tipo derivado puede exponer todos los métodos y propiedades del objeto COM además de los métodos y propiedades implementados en código administrado. El objeto resultante se implementa parcialmente en código administrado y parcialmente en código no administrado.

Para que pueda calificarse como clase base, la coclase debe:

Los tipos administrados pueden extender el RCW de una coclase calificada y reemplazar los métodos proporcionados por el objeto base. Se deben reemplazar todos los métodos base de una interfaz para reemplazar cualquiera de los métodos.

Un tipo administrado se hereda de un RCW de la misma forma que se hereda de un objeto base administrado. En el siguiente ejemplo de código, la clase Catapult administrada se deriva de AcmeLib.Slingshot, un 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();

Agregación

Para exponer las interfaces de una clase COM como si estuvieran implementadas en otra clase COM, la segunda clase se agrega a la primera. Un objeto COM puede agregar un objeto .NET y, en ese caso, todas las interfaces del objeto, incluida su interfaz de clase, están disponibles a través del objeto externo. El objeto .NET interno delega las llamadas a sus métodos IUnknown en el IUnknown de control.

La agregación es algo más complicada que el almacenamiento, que se describe en la siguiente sección. Normalmente se usa para permitir que el objeto externo exponga la implementación de una interfaz de otro objeto sin modificaciones. Todos los objetos administrados admiten automáticamente la agregación de estilo COM en que el objeto administrado se usa como objeto interno. Para agregar un objeto administrado, el objeto externo no administrado crea el objeto interno administrado llamando a CoCreateInstance y pasando la interfaz IUnknown del objeto externo como un parámetro OuterUnknown. Cuando se pasa un IUnknown externo a un objeto administrado durante la creación, el objeto administrado almacena en caché la interfaz y la usa de la manera siguiente:

  • El objeto exterior mantiene el Iunknown no delegado del IUnknown interno. El IUnknown no delegado se comporta como un IUnknown normal, es decir, se ejecuta con éxito si el objeto implementa la interfaz y falla en caso contrario. El IUnknown no delegado no reenvía la llamada al objeto exterior.

  • Si al objeto interno se le pide una interfaz que no admite, delega la llamada en la interfaz IUnknown del objeto externo.

  • Todas las llamadas a los métodos QueryInterface, AddRef y Release del objeto interno se delegan en la interfaz IUnknown del objeto externo.

Estos tres comportamientos permiten agregar cualquier objeto administrado. Con este tipo de relación de agregación se puede tener un único objeto COM que se implementa parcialmente en código administrado (la parte interna) y parcialmente en código no administrado (la parte externa).

Almacenamiento

Un objeto .NET puede contener un objeto COM mediante la importación de sus metadatos en un ensamblado .NET y la posterior declaración de miembro de datos de ese tipo en otra clase. Al igual que con el almacenamiento COM normal, se puede llamar a las interfaces del objeto COM en las implementaciones de interfaz propias, pero el objeto almacenado no se expone fuera de la clase. El almacenamiento es más sencillo que la agregación. El almacenamiento se usa normalmente cuando el objeto externo tiene que modificar el comportamiento del objeto interno. Para lograrlo, el objeto externo no tiene más que crear una instancia del objeto interno en su constructor y delegar las llamadas en el objeto interno según sea necesario. El objeto externo puede elegir qué llamadas delegar y cuáles controlar directamente. El motor en tiempo de ejecución no tiene requisitos especiales para que los objetos sean compatibles con el almacenamiento.

Un objeto COM puede contener también un objeto .NET. En lo que se refiere a los clientes del objeto COM, el comportamiento es exactamente igual que si el objeto almacenado fuera cualquier otro objeto COM.

Vea también

Conceptos

Exponer componentes COM en .NET Framework

Exponer componentes de .NET Framework en COM

Otros recursos

Interoperabilidad COM avanzada