Compartir a través de


Utilizar un contador de referencias sustituto

Una vez que el contador de referencias esté terminado, se puede usar como contenedor personalizado para un tipo concreto. En el ejemplo siguiente se muestra la definición de interfaz administrada IUserData:

Public Interface IUserData
    Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
    void DoSomeStuff(INew pINew);
}

En el ejemplo siguiente, la interfaz IUserData usa NewOldMarshaler para que los clientes no administrados puedan pasar una interfaz IOld al método DoSomeStuff. La descripción administrada del método DoSomeStuff toma una interfaz INew, como se muestra en el ejemplo anterior, mientras que la versión no administrada de DoSomeStuff toma un puntero a la interfaz IOld, como se muestra en el ejemplo siguiente.

Representación de biblioteca de tipos

[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
     [uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
     interface IUserData : IUnknown
         HRESULT DoSomeStuff(IUnknown* pIOld);
}

La biblioteca de tipos generada mediante la exportación de la definición administrada de IUserData produce la definición no administrada que se muestra en este ejemplo en lugar de la definición estándar. El atributo MarshalAsAttribute aplicado al argumento INew en la definición administrada del método DoSomeStuff indica que el argumento utiliza un contador de referencias personalizado como muestra el siguiente ejemplo:

Imports System.Runtime.InteropServices

Public Interface IUserData
    Public Sub DoSomeStuff( _
        <MarshalAs(UnmanagedType.CustomMarshaler, _
        MarshalType := "MyCompany.NewOldMarshaler")> pINew As INew)
    End Sub
End Interface
using System.runtime.InteropServices;

public interface IUserData {
    void DoSomeStuff(
        [MarshalAs(UnmanagedType.CustomMarshaler,
             MarshalType="MyCompany.NewOldMarshaler")]
        INew pINew
    );
}

Cuando se usa para especificar un contador de referencias personalizado, MarshalAsAttribute toma los dos parámetros con nombre siguientes:

  • MarshalType (Requerido)

    Nombre completo del ensamblado del contador de referencias personalizado. El nombre debe incluir el espacio de nombres y la clase del contador de referencias personalizado. Si se define el contador de referencias personalizado en un ensamblado diferente de donde éste se utiliza, se debe especificar el nombre del ensamblado en el cual se define.

    Nota

    Se puede utilizar el campo MarshalTypeRef en lugar del campo MarshalType. MarshalTypeRef toma un tipo que es fácil de especificar.

  • MarshalCookie (Opcional)

    Cookie que se pasa al contador de referencias personalizado. Esta cookie se puede usar para proporcionar información adicional al contador de referencias. Por ejemplo, se puede utilizar el mismo contador de referencias para proporcionar varios contenedores en los que la cookie identifica el contenedor específico. La cookie se pasa al método GetInstance del contador de referencias.

Vea también

Conceptos

Definir el tipo de cálculo de referencias
Implementar la interfaz ICustomMarshaler

Otros recursos

Cálculo de referencias personalizado