Verwenden eines Ersatzmarshallers
Sobald der Marshaller vollständig ist, kann er als benutzerdefinierter Wrapper für einen bestimmten Typ verwendet werden. Im folgenden Beispiel wird die verwaltete Schnittstellendefinition IUserData dargestellt:
Public Interface IUserData
Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
void DoSomeStuff(INew pINew);
}
Im folgenden Beispiel verwendet die Schnittstelle IUserData den NewOldMarshaler, um nicht verwalteten Clients die Übergabe der IOld-Schnittstelle an die DoSomeStuff-Methode zu ermöglichen. Wie im vorherigen Beispiel dargestellt, verwendet die verwaltete Beschreibung der DoSomeStuff-Methode die INew-Schnittstelle. Im folgenden Beispiel verwendet die nicht verwaltete Version von DoSomeStuff den IOld-Schnittstellenzeiger.
Typbibliothekdarstellung
[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
[uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
interface IUserData : IUnknown
HRESULT DoSomeStuff(IUnknown* pIOld);
}
Die Typbibliothek, die durch das Exportieren der verwalteten Definition von IUserData generiert wurde, ergibt die in diesem Beispiel dargestellte nicht verwaltete Definition und nicht die Standarddefinition. Das auf das INew-Argument in der verwalteten Definition der DoSomeStuff-Methode angewendete MarshalAsAttribute-Attribut zeigt an, dass das Argument einen benutzerdefinierten Marshaller verwendet, wie im folgenden Beispiel dargestellt:
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
);
}
Wenn MarshalAsAttribute zur Angabe eines benutzerdefinierten Marshallers verwendet wird, werden die beiden folgenden benannten Parameter verwendet:
MarshalType (erforderlich)
Der durch die Assembly bezeichnete Name des benutzerdefinierten Marshallers. Der Name sollte den Namespace sowie die Klasse des benutzerdefinierten Marshallers enthalten. Wenn der benutzerdefinierte Marshaller in unterschiedlichen Assemblys definiert und verwendet wird, müssen Sie den Namen der Assembly angeben, in der er definiert wird.
Hinweis Sie können anstelle des MarshalType-Felds das MarshalTypeRef-Feld verwenden.MarshalTypeRef akzeptiert einen Typ, der leichter festzulegen ist.
MarshalCookie (Optional)
Ein dem benutzerdefinierten Marshaller übergebenes Cookie. Mithilfe des Cookies können Sie zusätzliche Informationen für den Marshaller bereitstellen. Wenn beispielsweise ein Marshaller zum Bereitstellen mehrerer Wrapper verwendet wird, können die einzelnen Wrapper mithilfe von Cookies identifiziert werden. Das Cookie wird an die GetInstance-Methode des Marshallers übergeben.
Siehe auch
Konzepte
Benutzerdefiniertes Marshalling