Exporter (0) Imprimer
Développer tout
Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source

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 {
    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.

[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 :

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 (obligatoire)

    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.

    RemarqueRemarque

    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.

Ajouts de la communauté

AJOUTER
Afficher:
© 2014 Microsoft