Compartir a través de


Cálculo de referencias de interoperabilidad

El cálculo de referencia de interoperabilidad gobierna la forma en que los datos se pasan en argumentos de método y en los valores devueltos entre la memoria administrada y no administrada durante las llamadas. El cálculo de referencias operativo es una actividad en tiempo de ejecución que realiza el servicio de cálculo de referencias de Common Language Runtime.

La mayor parte de los tipos de datos tienen representaciones comunes en la memoria administrada y en la no administrada. El contador de referencias interoperativo controla estos tipos. Otros tipos pueden ser ambiguos o no estar representados en la memoria administrada.

Un tipo ambiguo puede tener varias representaciones no administradas que se asignan a un solo tipo administrado o bien información de tipos que falta, como el tamaño de una matriz. Para los tipos ambiguos, el contador de referencias ofrece una representación predeterminada y representaciones alternativas, cuando hay varias. Puede proporcionar instrucciones explícitas al contador de referencias sobre cómo debe calcular las referencias de un tipo ambiguo.

Esta información general contiene las siguientes secciones:

  • Modelos de invocación de plataforma y de interoperatividad COM

  • Calcular referencias y apartamentos COM

  • Calcular referencias de llamadas remotas

  • Temas relacionados

  • Referencia

Modelos de invocación de plataforma y de interoperatividad COM

Common Language Runtime proporciona dos mecanismos para interoperar con código no administrado:

  • Invocación de plataforma, que permite al código administrado llamar a funciones exportadas de una biblioteca no administrada.

  • Interoperabilidad COM, que permite al código administrado interactuar con objetos del Modelo de objetos componentes (COM) mediante interfaces.

Tanto la invocación de plataforma como la interoperatividad COM utilizan el cálculo de referencia de interoperabilidad para pasar de una forma precisa los argumentos de los métodos entre el llamador y el destinatario de la llamada y de nuevo de vuelta, si es necesario. Como se ve en la ilustración siguiente, una llamada de método de invocación de plataforma fluye desde código administrado a no administrado y nunca al contrario, excepto cuando intervienen funciones de devolución de llamada. Aunque las llamadas de invocación de plataforma pueden fluir solo de código administrado a no administrado, los datos pueden fluir en ambas direcciones como parámetros de entrada o de salida. Las llamadas de método de interoperatividad COM pueden fluir en ambas direcciones.

Flujo de llamadas de invocación de plataforma y de interoperatividad COM

Invocación de plataforma

En el nivel inferior ambos mecanismos utilizan el mismo servicio de cálculo de referencia de interoperabilidad; no obstante, sólo la interoperatividad COM o la invocación de plataforma admiten ciertos tipos de datos. Para obtener información detallada, vea Comportamiento del cálculo de referencias predeterminado.

Volver al principio

Calcular referencias y apartamentos COM

El contador de referencias interoperativo calcula las referencias entre el montón de Common Language Runtime y el montón no administrado. El cálculo de referencias se produce siempre que el llamador y el destinatario de la llamada no puedan operar con las mismas instancias de datos. El contador de referencias de interoperabilidad permite al llamador y al destinatario de la llamada que parezca que están operando con los mismos datos aunque ambos tengan sus propias copias de los mismos.

COM también dispone de un contador de referencias que calcula referencias de datos entre apartamentos COM o varios procesos COM. Al realizar llamadas entre código administrado y no administrado con el mismo apartamento COM, el contador de referencias interoperativo es el único contador de referencias que participa. Al realizar llamadas entre código administrado y no administrado en un apartamento COM o proceso COM distinto, participan el contador de referencias interoperativo y el contador de referencias COM.

Clientes COM y servidores administrados

Un servidor administrado exportado con una biblioteca de tipos registrada por Regasm.exe (Herramienta de registro de ensamblados) tiene una entrada ThreadingModel del Registro establecida en Both. Este valor indica que el servidor puede activarse en un STA (Single-Threaded Apartment, apartamento de un único subproceso) o un MTA (Multithreaded Apartment, apartamento multiproceso). El objeto de servidor se crea en el mismo apartamento que su llamador, como se aprecia en la tabla siguiente.

Cliente COM

Servidor .NET

Requisitos de cálculo de referencias

STA

Both se convierte en STA.

Cálculo de referencias del mismo apartamento.

MTA

Both se convierte en MTA.

Cálculo de referencias del mismo apartamento.

Dado que el cliente y el servidor están en el mismo apartamento, el servicio de cálculo de referencia de interoperabilidad controla automáticamente todo el cálculo de referencias de los datos. En la ilustración siguiente se muestra el servicio de cálculo de referencia de interoperabilidad que opera entre montones administrados y no administrados en el mismo apartamento del estilo de COM.

Proceso de cálculo de referencias del mismo apartamento

Cálculo de referencias interoperativo

Si pretende exportar un servidor administrado, tenga en cuenta que el cliente COM determina el apartamento del servidor. Un servidor administrado al que llama un cliente COM inicializado en un MTA debe garantizar la seguridad de la ejecución de subprocesos.

Clientes administrados y servidores COM

La configuración predeterminada para apartamentos de cliente administrado es MTA; no obstante, el tipo de aplicación del cliente .NET puede cambiarla. Por ejemplo, una configuración de apartamento de cliente de Visual Basic 2005 es STA. Puede usar la propiedad System.STAThreadAttribute, System.MTAThreadAttribute, Thread.ApartmentState o Page.AspCompatMode para examinar y cambiar la configuración del apartamento de un cliente administrado.

El autor del componente establece la afinidad del subproceso de un servidor COM. En la tabla siguiente se muestran las combinaciones de configuraciones de apartamentos de clientes .NET y servidores COM. Asimismo, se muestran los requisitos de cálculo de referencias resultantes de las combinaciones.

Cliente .NET

Servidor COM

Requisitos de cálculo de referencias

MTA (valor predeterminado)

MTA

STA

Cálculo de referencias interoperativo.

Cálculo de referencias interoperativo y COM.

STA

MTA

STA

Cálculo de referencias interoperativo y COM.

Cálculo de referencias interoperativo.

Cuando un cliente administrado y un servidor no administrado están en el mismo apartamento, el servicio de cálculo de referencia de interoperabilidad controla todo el cálculo de referencias de los datos. Sin embargo, cuando el cliente y el servidor se inicializan en apartamentos diferentes, también se requiere el cálculo de referencias COM. En la ilustración siguiente se muestran los elementos de una llamada entre apartamentos.

Llamada entre apartamentos entre un cliente .NET y un objeto COM

Cálculo de referencias COM

Para el cálculo de referencias entre apartamentos, puede realizar lo siguiente:

  • Aceptar la sobrecarga del cálculo de referencias entre apartamentos, que sólo se aprecia cuando muchas llamadas atraviesan el límite. Debe registrar la biblioteca de tipos del componente COM para que las llamadas crucen correctamente el límite de los apartamentos.

  • Alterar el subproceso principal mediante la configuración del subproceso del cliente como STA o MTA. Por ejemplo, si el cliente C# llama a muchos componentes COM STA, puede evitar el cálculo de referencias entre apartamentos si configura el subproceso principal como STA.

    NotaNota

    Una vez que se establece el subproceso de un cliente C# como STA, las llamadas a componentes COM MTA requerirán el cálculo de referencias entre apartamentos.

Para obtener instrucciones sobre cómo seleccionar explícitamente un modelo de apartamento, vea Subprocesamiento administrado y no administrado.

Volver al principio

Calcular referencias de llamadas remotas

Al igual que sucede con el cálculo de referencias entre apartamentos, el cálculo de referencias COM participa en cada llamada entre código administrado y código no administrado siempre que los objetos residan en procesos independientes. Por ejemplo:

  • Un cliente COM que invoca un servidor administrado en un host remoto usa COM distribuido (DCOM).

  • Un cliente administrado que invoca a un servidor COM en un host remoto utiliza DCOM.

En la ilustración siguiente se muestra cómo el cálculo de referencia de interoperabilidad y el cálculo de referencias COM proporcionan canales de comunicaciones a través de límites de hosts y de procesos.

Calcular referencias entre procesos

Cálculo de referencias COM

Conservar la identidad

Common Language Runtime conserva la identidad de las referencias administradas y no administradas. En la ilustración siguiente se muestra el flujo de referencias directas no administradas (fila superior) y referencias directas administradas (fila inferior) a través de límites de hosts y procesos.

Paso por referencia entre límites de hosts y procesos

Contenedor CCW y contenedor RCW

En esta ilustración:

  • Un cliente no administrado obtiene una referencia de un objeto COM a partir de un objeto administrado que obtiene esta referencia de un host remoto. El mecanismo de comunicación remota es DCOM.

  • Un cliente administrado obtiene una referencia de un objeto administrado a partir de un objeto COM que obtiene esta referencia de un host remoto. El mecanismo de comunicación remota es DCOM.

    NotaNota

    La biblioteca de tipos exportada del servidor administrado debe registrarse.

El número de límites de procesos entre el llamador y el destinatario de la llamada es irrelevante; la misma referencia directa ocurre en llamadas en proceso y fuera del proceso.

Comunicación remota administrada

El motor en tiempo de ejecución también permite la comunicación remota administrada, que se puede utilizar para establecer un canal de comunicaciones entre objetos administrados a través de límites de hosts y procesos. La comunicación remota administrada puede incluir un firewall entre los componentes de comunicación, como se muestra en la ilustración siguiente.

Llamadas remotas a través de firewalls que utilizan SOAP o la clase TcpChannel

SOAP o TcpChannel

Algunas llamadas no administradas pueden canalizarse mediante SOAP, como las que se producen entre componentes con servicio y COM. Para obtener más información sobre cómo utilizar la comunicación remota administrada, vea .NET Remoting Overview.

Volver al principio

Temas relacionados

Título

Descripción

Comportamiento del cálculo de referencias predeterminado

Se describen las reglas que usa el servicio de cálculo de referencia de interoperabilidad para calcular las referencias de los datos.

Calcular referencias de datos con invocación de plataforma

Se describe cómo declarar parámetros de método y pasar argumentos a funciones que exportan bibliotecas no administradas.

calcular referencias de datos con la interoperabilidad COM

Se describe cómo personalizar contenedores COM para alterar el comportamiento del cálculo de referencias.

Cómo: Asignar resultados HRESULT y excepciones

Describe cómo asignar excepciones personalizadas a valores HRESULT y proporciona la asignación completa de cada HRESULT a su clase de excepción comparable en .NET Framework.

Interoperar utilizando tipos genéricos

Describe qué acciones se admiten al utilizar tipos genéricos para la interoperabilidad COM.

Interoperar con código no administrado

Describe los servicios de interoperabilidad proporcionados por Common Language Runtime.

Interoperabilidad COM avanzada

Proporciona vínculos a más información sobre cómo incorporar los componentes COM a su aplicación .NET Framework.

Consideraciones de diseño para interoperaciones

Se proporcionan sugerencias para escribir componentes COM integrados.

.NET Remoting

Describe los diversos métodos disponibles en .NET Framework para las comunicaciones remotas.

Volver al principio

Referencia

System.Runtime.InteropServices

Volver al principio