Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El Common Language Runtime expone objetos COM a través de un proxy llamado encapsulador invocable en tiempo de ejecución (RCW). Aunque el RCW parece ser un objeto normal para los clientes de .NET, su función principal consiste en serializar las llamadas entre un cliente .NET y un objeto COM.
El tiempo de ejecución crea exactamente un RCW para cada objeto COM, independientemente del número de referencias que existen en ese objeto. CLR mantiene un único contenedor RCW por proceso para cada objeto. Si crea un contenedor RCW en un dominio de aplicación o apartamento y después pasa una referencia a otro dominio de aplicación o apartamento, se usará un proxy para el primer objeto. Tenga en cuenta que este proxy es un nuevo objeto administrado y no lo mismo que el RCW inicial; esto significa que los dos objetos administrados no son iguales, pero representan el mismo objeto COM. Como se muestra en la siguiente ilustración, cualquier número de clientes administrados puede contener una referencia a los objetos COM que exponen las interfaces INew
y INewer
.
En la imagen siguiente se muestra el proceso para acceder a objetos COM a través del contenedor invocable en tiempo de ejecución:
Con los metadatos derivados de una biblioteca de tipo, el entorno de ejecución crea tanto el objeto COM al que se llama como un encapsulador para ese objeto. Cada contenedor RCW mantiene una memoria caché de punteros de interfaz en el objeto COM que contiene y libera su referencia en el objeto COM cuando el contenedor RCW ya no es necesario. CLR realiza la recolección de elementos no utilizados en el contenedor RCW.
Entre otras actividades, el contenedor RCW calcula referencias de datos entre el código administrado y no administrado, en nombre del objeto encapsulado. El contenedor RCW proporciona específicamente serialización para argumentos de métodos y valores devueltos de métodos cada vez que el cliente y el servidor tienen representaciones diferentes de los datos que se pasan entre ellos.
El contenedor estándar impone las reglas de cálculo de referencias integradas. Por ejemplo, cuando un cliente .NET pasa un tipo string
como parte de un argumento a un objeto no administrado, el contenedor convierte el string
en un tipo BSTR
. Si el objeto COM devuelve un BSTR
a su llamador administrado, el llamador recibe un string
. Tanto el cliente como el servidor envían y reciben datos que les son familiares. Otros tipos no requieren ninguna conversión. Por ejemplo, un contenedor estándar pasará siempre un entero de 4 bytes entre el código administrado y no administrado sin convertir el tipo.
Serialización de interfaces seleccionadas
El objetivo principal del contenedor invocable en tiempo de ejecución (RCW) es ocultar las diferencias entre los modelos de programación administrados y no administrados. Para crear una transición sin problemas, RCW consume interfaces COM seleccionadas sin exponerlas al cliente .NET, como se muestra en la ilustración siguiente.
En la imagen siguiente se muestran las interfaces COM y el contenedor al que se puede llamar en tiempo de ejecución:
Cuando se crea como un objeto de enlace en tiempo de compilación, el contenedor RCW es un tipo específico. Implementa las interfaces que el objeto COM implementa y expone los métodos, propiedades y eventos de las interfaces del objeto. En la ilustración, el RCW expone la interfaz INew, pero consume las interfaces IUnknown e IDispatch . Además, el RCW expone todos los miembros de la interfaz INew al cliente .NET.
El contenedor RCW consume las interfaces enumeradas en la siguiente tabla, expuestas por el objeto que encapsula.
Interfaz | Descripción |
---|---|
IDispatch | Para el enlace en tiempo de ejecución a objetos COM mediante reflexión. |
IErrorInfo | Proporciona una descripción textual del error, su origen, un archivo de Ayuda, un contexto de Ayuda y el GUID de la interfaz que definió el error (siempre GUID_NULL para las clases de .NET). |
IProvideClassInfo | Si el objeto COM encapsulado implementa IProvideClassInfo, el RCW extrae la información de tipo de esta interfaz para proporcionar una mejor identidad de tipo. |
IUnknown | Para la identidad de objetos, la conversión de tipos y la administración de la duración: - Identidad de objeto El tiempo de ejecución distingue entre objetos COM comparando el valor de la interfaz IUnknown para cada objeto. - Coerción de tipos El RCW reconoce la detección de tipos dinámicos realizada por el método QueryInterface . - Gestión del ciclo de vida Con el método QueryInterface, el contenedor RCW obtiene y mantiene una referencia a un objeto no administrado hasta que CLR realiza la recolección de elementos no utilizados en el contenedor, lo que libera el objeto no administrado. |
Opcionalmente, el contenedor RCW consume las interfaces enumeradas en la siguiente tabla, expuestas por el objeto que encapsula.
Interfaz | Descripción |
---|---|
IConnectionPoint e IConnectionPointContainer | El contenedor RCW convierte los objetos que exponen el estilo de evento de punto de conexión en eventos basados en delegado. |
IDispatchEx (solo .NET Framework) | Si la clase implementa IDispatchEx, RCW implementa IExpando. La interfaz IDispatchEx es una extensión de la interfaz IDispatch que, a diferencia de IDispatch, habilita la enumeración, la adición, la eliminación y la llamada con distinción entre mayúsculas y minúsculas de los miembros. |
IEnumVARIANT | Permite que los tipos COM que admiten enumeraciones se traten como colecciones. |