Compartir a través de


Implementar la interfaz ICustomMarshaler

Para usar un contador de referencias personalizado, es necesario aplicar el atributo MarshalAsAttribute al parámetro o al campo cuyas referencias se están calculando. Este atributo identifica el contador de referencias personalizado que activa el contenedor adecuado.

En el siguiente código de C# se muestra la interfaz base que deben implementar todos los contadores de referencias personalizados:

namespace System.Runtime.InteropServices
{
    using System;

[System.Runtime.InteropServices.ComVisible(true)]
    public interface ICustomMarshaler
    {
     Object MarshalNativeToManaged( IntPtr pNativeData );
     IntPtr MarshalManagedToNative( Object ManagedObj );
     void CleanUpNativeData( IntPtr pNativeData );
     void CleanUpManagedData( Object ManagedObj );
     int GetNativeDataSize();
    }
}

Su contador de referencias personalizado debe implementar la interfaz ICustomMarshaler para proporcionar los contenedores adecuados al motor en tiempo de ejecución.

Además, debe implementar el siguiente método estático, al que puede llamar para recuperar una instancia del contador de referencias personalizado:

static ICustomMarshaler *GetInstance(String *pstrCookie);

El motor en tiempo de ejecución crea el contador de referencias personalizado la primera vez que hay que calcular las referencias de un argumento. Después, el motor en tiempo de ejecución llama a los métodos ICustomMarshaler.MarshalNativeToManaged y ICustomMarshaler.MarshalManagedToNative del contador de referencias personalizado para activar el contenedor correcto y, así, controlar la llamada. En la tabla siguiente se describen los métodos expuestos por la interfaz ICustomMarshaler.

Método

Descripción

MarshalNativeToManaged

Calcula las referencias de un puntero a datos nativos en un objeto administrado. Este método devuelve un contenedor RCW personalizado que puede calcular las referencias de la interfaz no administrada que se pasa como argumento. El contador de referencias debe devolver una instancia del contenedor RCW personalizado para ese tipo.

MarshalManagedToNative

Calcula las referencias de un objeto administrado en un puntero a datos nativos. Este método devuelve un contenedor CCW personalizado que puede calcular las referencias de la interfaz administrada que se pasa como argumento. El contador de referencias debe devolver una instancia del contenedor CCW personalizado para ese tipo.

CleanUpNativeData

Permite al contador de referencias limpiar los datos nativos devueltos por el método MarshalManagedToNative.

CleanUpManagedData

Permite al contador de referencias limpiar los datos administrados devueltos por el método MarshalNativeToManaged.

GetNativeDataSize

Devuelve el tamaño de los datos no administrados cuyas referencias se van a calcular.

Vea también

Conceptos

Definir el tipo de cálculo de referencias

Utilizar un contador de referencias sustituto

Otros recursos

Cálculo de referencias personalizado