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