Implementazione dell'interfaccia ICustomMarshaler
Per utilizzare un gestore di marshalling personalizzato, applicare l'attributo MarshalAsAttribute al parametro o al campo di cui si desidera effettuare il marshalling. Questo attributo identifica il gestore di marshalling personalizzato che attiva il wrapper appropriato.
Nel codice C# seguente viene visualizzata l'interfaccia di base che deve essere implementata da tutti i gestori di marshalling personalizzati:
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();
}
}
Il gestore di marshalling personalizzato deve implementare l'interfaccia ICustomMarshaler per fornire i wrapper appropriati al runtime.
È inoltre necessario implementare il metodo statico seguente, che è possibile chiamare per recuperare un'istanza del gestore di marshalling personalizzato:
static ICustomMarshaler *GetInstance(String *pstrCookie);
Il gestore di marshalling personalizzato viene creato dal runtime la prima volta che è necessario effettuare il marshalling di un argomento. Il runtime chiama quindi i metodi ICustomMarshaler.MarshalNativeToManaged e ICustomMarshaler.MarshalManagedToNative nel gestore di marshalling personalizzato per attivare il wrapper corretto per la gestione della chiamata. Nella tabella seguente sono descritti i metodi esposti dall'interfaccia ICustomMarshaler.
Metodo |
Descrizione |
---|---|
Effettua il marshalling di un puntatore ai dati nativi in un oggetto gestito. Questo metodo restituisce un oggetto Runtime Callable Wrapper (RCW) personalizzato in grado di effettuare il marshalling dell'interfaccia non gestita passata come argomento. Il gestore di marshalling deve restituire un'istanza dell'oggetto RCW personalizzato per il tipo. |
|
Effettua il marshalling di un oggetto gestito in un puntatore ai dati nativi. Questo metodo restituisce un oggetto COM Callable Wrapper (CCW) personalizzato in grado di effettuare il marshalling dell'interfaccia gestita passata come argomento. Il gestore di marshalling deve restituire un'istanza dell'oggetto CCW personalizzato per il tipo. |
|
Consente al gestore di marshalling di eseguire la pulizia dei dati nativi restituiti dal metodo MarshalManagedToNative. |
|
Consente al gestore di marshalling di eseguire la pulizia dei dati gestiti restituiti dal metodo MarshalNativeToManaged. |
|
Restituisce le dimensioni dei dati non gestiti di cui effettuare il marshalling. |