Cálculo de referencias predeterminado para clases

Actualización: noviembre 2007

Las referencias de clases sólo se pueden calcular mediante interoperatividad COM y siempre como interfaces. En algunos casos, la interfaz utilizada para calcular las referencias de la clase se conoce como interfaz de clase. Para obtener información sobre cómo reemplazar la interfaz de clase con una interfaz de su elección, vea Introducción a la interfaz de clase.

Pasar clases a COM

Cuando una clase administrada se pasa a COM, el contador de referencias interoperativo incluye automáticamente a la clase con un proxy COM y pasa la interfaz de clase que produce el proxy a la llamada al método COM. A continuación, el proxy delega todas las llamadas de la interfaz de clase de nuevo al objeto administrado. El proxy también expone otras interfaces que no implementa explícitamente la clase. El proxy implementa automáticamente interfaces como IUnknown e IDispatch en nombre de la clase.

Pasar clases a código de .NET

Normalmente, las clases no se utilizan como argumentos de método en COM. En cambio, se suele pasar una interfaz predeterminada en lugar de la coclase.

Cuando se pasa una interfaz a código administrado, el contador de referencias interoperativo es responsable de incluirla en el contenedor adecuado y pasar éste al método administrado. Determinar qué contenedor utilizar puede resultar complicado. Toda instancia de un objeto COM tiene un solo contenedor, independientemente del número de interfaces que implemente el objeto. Por ejemplo, un solo objeto COM que implementa cinco interfaces distintas tiene sólo un contenedor. El mismo contenedor expone las cinco interfaces. Si se crean dos instancias del objeto COM, se crearán dos instancias del contenedor.

Para que el contenedor mantenga el mismo tipo a lo largo de todo su período de duración, el contador de referencias interoperativo debe identificar el contenedor correcto la primera vez que una interfaz que expone el objeto se pasa a través del contador de referencias. Para identificar el objeto, el contador de referencias examina una de las interfaces que implementa el objeto.

Por ejemplo, el contador de referencias determina que el contenedor de la clase debe utilizarse para incluir la interfaz que se pasó en el código administrado. Cuando se pasa por primera vez la interfaz por el contador de referencias, éste comprueba si proviene de un objeto conocido. Esta comprobación tiene lugar en dos situaciones:

  • Un objeto administrado que se pasó a COM en otro lugar está implementando una interfaz. El contador de referencias puede identificar inmediatamente las interfaces expuestas mediante objetos administrados y es capaz de hacer que la interfaz coincida con el objeto administrado que proporciona la implementación. A continuación, el objeto administrado se pasa al método y no se necesita un contenedor.

  • Un objeto que ya se ha incluido está implementando la interfaz. Para determinar si éste es el caso, el contador de referencias consulta al objeto su interfaz IUnknown y compara la interfaz devuelta con las de otros objetos que ya están incluidos. Si la interfaz es la misma que la de otro contenedor, los objetos tendrán la misma identidad y el contenedor existente se pasa al método.

Si una interfaz no es de un objeto conocido, el contador de referencias realiza lo siguiente:

  1. El contador de referencias consulta la interfaz IProvideClassInfo2 en el objeto. Si se proporciona, el contador de referencias utiliza el CLSID devuelto de IProvideClassInfo2.GetGUID para identificar la coclase que proporciona la interfaz. Con el CLSID, el contador de referencias puede ubicar el contenedor en el Registro si el ensamblado se ha registrado previamente.

  2. El contador de referencias consulta a la interfaz la interfaz IProvideClassInfo. Si se proporciona, el contador de referencias utiliza el ITypeInfo devuelto de IProvideClassInfo2.GetClassinfo para determinar el CLSID de la clase que expone la interfaz. El contador de referencias puede utilizar el CLSID para buscar los metadatos para el contenedor.

  3. Si el contador de referencias sigue sin poder identificar la clase, incluye la interfaz en una clase de contenedor genérico denominada System.__ComObject.

Vea también

Conceptos

Tipos que pueden o que no pueden representarse como bits o bytes

Atributos direccionales

Copiar y fijar

Otros recursos

Comportamiento predeterminado del cálculo de referencias