Attributs directionnels

Mise à jour : novembre 2007

Chaque paramètre de méthode peut être associé à un paramètre pour l'attribut InAttribute, l'attribut OutAttribute ou les deux. Vous appliquez des attributs directionnels au moment du design pour modifier le marshaling runtime entre la mémoire managée et la mémoire non managée.

Les attributs InAttribute et OutAttribute sont situés dans l'espace de noms System.Runtime.InteropServices et sont équivalents aux attributs d'interface [in], [out], [in/out] et [out, retval] du langage de définition d'interface (IDL, Interface Definition Language).

Remarque :

La valeur de retour d'une signature de méthode managée mappe toujours à [out, retval] dans une bibliothèque de types. Il n'existe aucun attribut directionnel équivalent que vous puissiez appliquer.

Les attributs directionnels sont facultatifs. Vous les appliquez aux paramètres de méthode lorsque vous voulez modifier le comportement par défaut du marshaleur. Si vous omettez les attributs directionnels d'un paramètre de méthode, le marshaleur détermine le flux directionnel à partir du type du paramètre (valeur ou référence) et de ses modificateurs éventuels.

Certains langages fournissent des mots clés qui vous permettent de modifier le flux directionnel des paramètres de méthode. Le tableau suivant répertorie les mots clés liés à la direction fournis par Visual Basic 2005 et C#, et montre l'attribut d'interface IDL équivalent.

Visual Basic 2005

C#

Attribut IDL

ByVal

Pas d'équivalent.

[in]

ByRef

ref

[in/out]

Pas d'équivalent.

out

[out]

Les modificateurs de paramètre ByRef, ref et out entraînent le marshaling des arguments de méthode par référence plutôt que par valeur. Les arguments de méthode passés par valeur sont marshalés au code non managé en tant que valeurs dans la pile ; les arguments passés par référence sont marshalés comme pointeurs dans la pile. L'illustration suivante montre le comportement de marshaling par défaut des types valeur et types référence avec des modificateurs de paramètre.

Marshaling par défaut des arguments de méthode au code non managé

Comportement de marshaling par défaut

Par défaut, les types référence (classes, tableaux, chaînes et interfaces) passés par valeur sont marshalés en tant que paramètres en entrée afin d'améliorer les performances. Les modifications appliquées à ces types n'apparaissent pas tant que vous n'appliquez pas InAttribute et OutAttribute (ou simplement OutAttribute) au paramètre de méthode. La classe StringBuilder, qui fait exception à cette règle, est marshalée en tant que paramètre en entrée/sortie.

Le marshaleur d'interopérabilité garantit le comportement suivant par rapport aux attributs directionnels :

  • Le marshaleur d'interopérabilité ne génère jamais une opération d'écriture à un paramètre en entrée passé à partir d'un code non managé. Ainsi, le code non managé peut passer un pointeur en toute sécurité à une page en lecture seule ou un pointeur à des données auxquelles on accède simultanément.

  • Lorsque l'objet copié contient un objet alloué, tel qu'un BSTR, le marshaleur exécute toujours la séquence correcte d'allocations et de destructions imposée par les paramètres en entrée/sortie.

Il est important d'appliquer correctement les attributs directionnels dans votre code. Appliquer correctement les attributs InAttribute et OutAttribute aux paramètres dans le code managé garantit que Type Library Exporter (Tlbexp.exe) utilise ces bits pour définir les bits en entré/sortie dans la bibliothèque de types correspondante ; cela s'avère particulièrement important pour les types référence qui peuvent être épinglés, notamment certains tableaux et classes.

Voir aussi

Concepts

Gestion de la mémoire avec le marshaleur d'interopérabilité

Types blittables et non blittables

Copie et épinglage

Autres ressources

Comportement de marshaling par défaut