Share via


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.

    HinweisHinweis

    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

Definieren des Marshallingtyps

Implementieren der ICustomMarshaler-Schnittstelle