Compartir a través de


Instrucciones para exponer funcionalidad a COM

Common Language Runtime proporciona compatibilidad total para interoperar con componentes COM. Un componente COM se puede utilizar dentro de un tipo administrado y una instancia administrada se puede utilizar en un componente COM. Esta compatibilidad es la clave para desplazar una parte del código no administrado al código administrado cada vez; sin embargo, también presenta algunos problemas para los diseñadores de bibliotecas de clases. Para exponer totalmente un tipo administrado a clientes COM, el tipo debe exponer funcionalidad de forma que sea compatible y respete los términos del contrato de control de versiones de COM.

Marque las bibliotecas de clases administradas con el atributo ComVisibleAttribute para indicar si los clientes COM pueden utilizar la biblioteca directamente o deben utilizar un contenedor para adaptar las funcionalidades.

Los tipos y las interfaces que se deben utilizar directamente en los clientes COM, como alojarlos en un contenedor no administrado, se deben marcar con el atributo ComVisible(true). El cierre transitivo de todos los tipos a los que se hace referencia en los tipos expuestos debe marcarse explícitamente como ComVisible(true); en caso contrario, se expondrán como IUnknown.

Nota   Los miembros de un tipo también deben marcarse como ComVisible(false); esto reduce la exposición a COM y, por tanto, las restricciones en la utilización de tipos administrados.

Los tipos marcados con el atributo ComVisible(true) no pueden exponer las funcionalidades únicamente de forma que no se puedan utilizar en COM. En concreto, COM no es compatible con los métodos estáticos ni con los constructores parametrizados. Pruebe la funcionalidad del tipo en clientes COM para comprobar que su comportamiento es correcto. Asegúrese de que comprende el impacto que tiene en el Registro hacer que todos los tipos se puedan crear conjuntamente.

Cálculo por referencia

Los objetos de cálculo por referencia son Objetos utilizables de forma remota. La interacción remota de objetos se aplica a las tres clases de tipos siguientes:

  • Tipos cuyas instancias se copian cuando se calculan sus referencias a través de un límite AppDomain (en el mismo equipo o en un equipo diferente). Estos tipos se deben marcar con el atributo Serializable.
  • Tipos para los que el motor de ejecución crea un proxy transparente cuando se calculan sus referencias a través de un límite AppDomain (en el mismo equipo o en un equipo diferente). Estos tipos se deben derivar en última instancia de la Clase System.MarshalByRefObject.
  • Tipos cuyas referencias no se calculan en ningún caso a través de dominios AppDomains. Éste es el valor predeterminado.

Siga estas instrucciones al utilizar el cálculo de referencias por referencia:

  • De forma predeterminada, las referencias de instancias se deben calcular con objetos de valores. Esto significa que sus tipos se deben marcar como Serializable.
  • Las referencias de tipos de componentes se deben calcular con objetos de referencia. Éste ya debería ser el caso de la mayoría de componentes, porque la clase base común o Clase System.Component, es una clase de cálculo por referencia.
  • Si el tipo encapsula un recurso del sistema operativo, las referencias del recurso se deben calcular con un objeto de referencia. Si el tipo implementa la Interfaz IDisposable es muy probable que las referencias se calculen por referencia. System.IO.Stream se deriva de MarshalByRefObject. En la mayoría de las secuencias, como FileStreams y NetworkStreams, se encapsulan recursos externos para que las referencias se calculen con objetos de referencia.
  • En las instancias que simplemente alojan un estado las referencias se deben calcular con objetos de valor (como DataSet).
  • Los tipos especiales que no se pueden llamar a través de un límite AppDomain (como el propietario de métodos estáticos de utilidades) no se deben marcar como Serializable.

Vea también

Instrucciones de diseño para programadores de bibliotecas de clases | Clase System.MarshalByRefObject | Exponer componentes de .NET Framework a COM