Contenedor al que se puede llamar en tiempo de ejecuciónRuntime Callable Wrapper

Common Language Runtime expone objetos COM mediante un proxy denominado el contenedor RCW (Runtime Callable Wrapper).The common language runtime exposes COM objects through a proxy called the runtime callable wrapper (RCW). Aunque el contenedor RCW aparece como un objeto corriente para los clientes .NET, su función principal es calcular referencias de llamadas entre un cliente .NET y un objeto COM.Although the RCW appears to be an ordinary object to .NET clients, its primary function is to marshal calls between a .NET client and a COM object.

CLR crea exactamente un contenedor RCW para cada objeto COM, independientemente del número de referencias que existan en ese objeto.The runtime creates exactly one RCW for each COM object, regardless of the number of references that exist on that object. CLR mantiene un único contenedor RCW por proceso para cada objeto.The runtime maintains a single RCW per process for each object. 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.If you create an RCW in one application domain or apartment, and then pass a reference to another application domain or apartment, a proxy to the first object will be used. 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 e INewer.As the following illustration shows, any number of managed clients can hold a reference to the COM objects that expose INew and INewer interfaces.

En la imagen siguiente se muestra el proceso para obtener acceso a objetos COM a través del contenedor RCW:The following image shows the process for accessing COM objects through the runtime callable wrapper:

Proceso para obtener acceso a objetos COM a través del contenedor RCW.

Usando los metadatos derivados de una biblioteca de tipos, CLR crea el objeto COM al que se está llamando y un contenedor para dicho objeto.Using metadata derived from a type library, the runtime creates both the COM object being called and a wrapper for that object. 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.Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. CLR realiza la recolección de elementos no utilizados en el contenedor RCW.The runtime performs garbage collection on the RCW.

Entre otras actividades, el contenedor RCW calcula referencias de datos entre el código administrado y no administrado, en nombre del objeto encapsulado.Among other activities, the RCW marshals data between managed and unmanaged code, on behalf of the wrapped object. 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.Specifically, the RCW provides marshaling for method arguments and method return values whenever the client and server have different representations of the data passed between them.

El contenedor estándar impone las reglas de cálculo de referencias integradas.The standard wrapper enforces built-in marshaling rules. Por ejemplo, cuando un cliente .NET pasa un tipo String como parte de un argumento a un objeto no administrado, el contenedor convierte la cadena en un tipo BSTR.For example, when a .NET client passes a String type as part of an argument to an unmanaged object, the wrapper converts the string to a BSTR type. Si el objeto COM devuelve una cadena BSTR a su llamador administrado, el llamador recibe una cadena.Should the COM object return a BSTR to its managed caller, the caller receives a String. Tanto el cliente como el servidor envían y reciben datos que les resultan familiares.Both the client and the server send and receive data that is familiar to them. Otros tipos no requieren conversión.Other types require no conversion. 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.For instance, a standard wrapper will always pass a 4-byte integer between managed and unmanaged code without converting the type.

Serialización de interfaces seleccionadasMarshaling selected interfaces

El objetivo principal del contenedor RCW es ocultar las diferencias entre los modelos de programación administrada y no administrada.The primary goal of the runtime callable wrapper (RCW) is to hide the differences between the managed and unmanaged programming models. Para crear una transición fluida, el contenedor RCW consume interfaces COM seleccionadas sin exponerlas al cliente .NET, tal y como se muestra en la siguiente ilustración.To create a seamless transition, the RCW consumes selected COM interfaces without exposing them to the .NET client, as shown in the following illustration.

En la imagen siguiente se muestran las interfaces COM y el contenedor RCW:The following image shows COM interfaces and the runtime callable wrapper:

Captura de pantalla del contenedor RCW con interfaces.

Cuando se crea como un objeto de enlace en tiempo de compilación, el contenedor RCW es un tipo específico.When created as an early-bound object, the RCW is a specific type. Implementa las interfaces que el objeto COM implementa, y expone los métodos, las propiedades y los eventos de las interfaces del objeto.It implements the interfaces that the COM object implements and exposes the methods, properties, and events from the object's interfaces. En la ilustración, el contenedor RCW expone la interfaz INew pero consume las interfaces IUnknown e IDispatch.In the illustration, the RCW exposes the INew interface but consumes the IUnknown and IDispatch interfaces. Además, el contenedor RCW expone todos los miembros de la interfaz INew al cliente .NET.Further, the RCW exposes all members of the INew interface to the .NET client.

El contenedor RCW consume las interfaces enumeradas en la siguiente tabla, expuestas por el objeto que encapsula.The RCW consumes the interfaces listed in the following table, which are exposed by the object it wraps.

InterfazInterface DESCRIPCIÓNDescription
IDispatchIDispatch Para el enlace en tiempo de ejecución a objetos COM mediante reflexión.For late binding to COM objects through reflection.
IErrorInfoIErrorInfo Proporciona una descripción textual del error, su origen, un archivo de ayuda, contexto de ayuda y el GUID de la interfaz que definió el error (siempre GUID_NULL para las clases. NET).Provides a textual description of the error, its source, a Help file, Help context, and the GUID of the interface that defined the error (always GUID_NULL for .NET classes).
IProvideClassInfoIProvideClassInfo Si el objeto COM que se está encapsulando implementa IProvideClassInfo, el contenedor RCW extrae la información de tipos de esta interfaz para proporcionar una mejor identidad de tipos.If the COM object being wrapped implements IProvideClassInfo, the RCW extracts the type information from this interface to provide better type identity.
IUnknownIUnknown Para la identidad de objetos, la conversión de tipos y la administración de la duración:For object identity, type coercion, and lifetime management:

- Identidad de objetos- Object identity
El tiempo de ejecución distingue los objetos COM comparando el valor de la interfaz IUnknown de cada objeto.The runtime distinguishes between COM objects by comparing the value of the IUnknown interface for each object.
- Coerción de tipos- Type coercion
El contenedor RCW reconoce la detección dinámica de tipos que realiza el método QueryInterface.The RCW recognizes the dynamic type discovery performed by the QueryInterface method.
- Administración de la duración- Lifetime management
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.Using the QueryInterface method, the RCW gets and holds a reference to an unmanaged object until the runtime performs garbage collection on the wrapper, which releases the unmanaged object.

Opcionalmente, el contenedor RCW consume las interfaces enumeradas en la siguiente tabla, expuestas por el objeto que encapsula.The RCW optionally consumes the interfaces listed in the following table, which are exposed by the object it wraps.

InterfazInterface DESCRIPCIÓNDescription
IConnectionPoint e IConnectionPointContainerIConnectionPoint and IConnectionPointContainer El contenedor RCW convierte los objetos que exponen el estilo de evento de punto de conexión en eventos basados en delegado.The RCW converts objects that expose the connection-point event style to delegate-based events.
IDispatchExIDispatchEx Si la clase implementa IDispatchEx, el contenedor RCW implementa IExpando.If the class implements IDispatchEx, the RCW implements IExpando. La interfaz IDispatchEx es una extensión de la interfaz IDispatch que, a diferencia de IDispatch, permite enumerar, agregar, eliminar y llamar a miembros con distinción de mayúsculas y minúsculas.The IDispatchEx interface is an extension of the IDispatch interface that, unlike IDispatch, enables enumeration, addition, deletion, and case-sensitive calling of members.
IEnumVARIANTIEnumVARIANT Permite tratar como colecciones a los tipos COM que admiten enumeraciones.Enables COM types that support enumerations to be treated as collections.

Vea tambiénSee also