Utilisation d'un marshaleur de remplacement

Une fois le marshaleur terminé, vous pouvez l'utiliser en tant que wrapper personnalisé pour un type particulier. L'exemple suivant montre la définition de l'interface managée IUserData :

Public Interface IUserData
    Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
    void DoSomeStuff(INew pINew);
}

Dans l'exemple suivant, l'interface IUserData utilise NewOldMarshaler afin de permettre aux clients non managés de passer une interface IOld à la méthode DoSomeStuff. La description managée de la méthode DoSomeStuff prend une interface INew, comme le montre l'exemple précédent, alors que la version non managée de DoSomeStuff accepte un pointeur d'interface IOld, comme le montre l'exemple suivant.

Représentation de la bibliothèque de types

[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
     [uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
     interface IUserData : IUnknown
         HRESULT DoSomeStuff(IUnknown* pIOld);
}

La bibliothèque de types générée par l'exportation de la définition managée de IUserData produit la définition non managée montrée dans cet exemple à la place de la définition standard. L'attribut MarshalAsAttribute appliqué à l'argument INew dans la définition managée de la méthode DoSomeStuff indique que l'argument utilise un marshaleur personnalisé, comme le montre l'exemple suivant :

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
    );
}

Lorsqu'il est utilisé pour spécifier un marshaleur personnalisé, MarshalAsAttribute accepte les deux paramètres nommés suivants :

  • MarshalType (requis)

    Nom qualifié par un assembly du marshaleur personnalisé. Le nom doit inclure l'espace de noms et la classe du marshaleur personnalisé. Si le marshaleur personnalisé est défini dans un assembly différent de celui dans lequel il est utilisé, vous devez spécifier le nom de l'assembly dans lequel il est défini.

    Notes

    Vous pouvez utiliser le champ MarshalTypeRef au lieu du champ MarshalType. MarshalTypeRef prend un type plus facile à spécifier.

  • MarshalCookie (facultatif)

    Cookie passé au marshaleur personnalisé. Vous pouvez utiliser le cookie pour fournir des informations supplémentaires au marshaleur. Par exemple, le même marshaleur peut être utilisé pour fournir un certain nombre de wrappers, pour lesquels le cookie identifie le wrapper spécifique. Le cookie est passé à la méthode GetInstance du marshaleur.

Voir aussi

Concepts

Définition du type de marshaling
Implémentation de l'interface ICustomMarshaler

Autres ressources

Marshaling personnalisé