Implementieren der ICustomMarshaler-Schnittstelle
Wenn Sie einen benutzerdefinierten Marshaller verwenden möchten, müssen Sie das MarshalAsAttribute-Attribut auf den Parameter oder das Feld anwenden, das gemarshallt werden soll. Dieses Attribut identifiziert den benutzerdefinierten Marshaller, der den entsprechenden Wrapper aktiviert.
Im folgenden C#-Code wird die Basisschnittstelle angezeigt, die von allen benutzerdefinierten Marshallern implementiert werden muss:
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();
}
}
Der benutzerdefinierte Marshaller muss die ICustomMarshaler-Schnittstelle implementieren, um die entsprechenden Wrapper für die Laufzeit bereitzustellen.
Außerdem müssen Sie die folgende statische Methode implementieren, die Sie aufrufen können, um eine Instanz des benutzerdefinierten Marshallers abzurufen:
static ICustomMarshaler *GetInstance(String *pstrCookie);
Die Laufzeit erstellt den benutzerdefinierten Marshaller, wenn das erste Mal ein Argument gemarshallt werden muss. Die Laufzeit ruft dann die ICustomMarshaler.MarshalNativeToManaged-Methode und die ICustomMarshaler.MarshalManagedToNative-Methode des benutzerdefinierten Marshallers auf, um den richtigen Wrapper für die Aufrufbehandlung zu aktivieren. In der folgenden Tabelle werden die Methoden beschrieben, die die ICustomMarshaler-Schnittstelle zur Verfügung stellt.
Methode |
Beschreibung |
---|---|
Marshallt einen Zeiger auf systemeigene Daten in ein verwaltetes Objekt. Diese Methode gibt einen benutzerdefinierten Runtime Callable Wrapper (RCW) zurück, der die als Argument übergebene nicht verwaltete Schnittstelle marshallen kann. Der Marshaller sollte eine Instanz des benutzerdefinierten RCW für diesen Typ zurückgeben. |
|
Marshallt ein verwaltetes Objekt in einen Zeiger auf systemeigene Daten. Diese Methode gibt einen benutzerdefinierten COM Callable Wrapper (CCW) zurück, der die als Argument übergebene verwaltete Schnittstelle marshallen kann. Der Marshaller sollte eine Instanz des benutzerdefinierten CCW für diesen Typ zurückgeben. |
|
Ermöglicht, dass der Marshaller systemeigene Daten bereinigen kann, die von der MarshalManagedToNative-Methode zurückgegeben werden. |
|
Ermöglicht, dass der Marshaller verwaltete Daten bereinigen kann, die von der MarshalNativeToManaged-Methode zurückgegeben werden. |
|
Gibt die Größe der nicht verwalteten Daten zurück, die gemarshallt werden sollen. |
Siehe auch
Konzepte
Benutzerdefiniertes Marshalling