Personnaliser le marshaling de paramètres

Si le comportement de marshaling des paramètres par défaut du runtime .NET ne vous convient pas, vous pouvez utiliser l’attribut System.Runtime.InteropServices.MarshalAsAttribute pour le personnaliser. Ces fonctionnalités de personnalisation ne s’appliquent pas lorsque le marshaling du runtime est désactivé.

Remarque

L’interopérabilité générée par la source pour P/Invokes et COM respecte uniquement un petit sous-ensemble de MarshalAsAttribute dans les paramètres. Il est recommandé d’utiliser plutôt MarshalUsingAttribute pour l’interopérabilité générée par la source. Pour plus d’informations, consultez Marshaling personnalisé pour la génération de la source.

Personnaliser des paramètres de chaîne

.NET propose tout un éventail de formats pour le marshaling des chaînes. Ces méthodes sont divisées en deux sections distinctes : les chaînes de style C et les chaînes orientées Windows.

Chaînes de style C

Chacun de ces formats transmet une chaîne se terminant par Null au code natif. Ils diffèrent par l’encodage de la chaîne native.

Valeur System.Runtime.InteropServices.UnmanagedType Encodage
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

Le format UnmanagedType.VBByRefStr est légèrement différent. Comme LPWStr, il marshale la chaîne en une chaîne de style C native encodée en UTF-16. Toutefois, la signature managée vous fait passer la chaîne en référence ; la signature native correspondante prend la chaîne en valeur. Cette distinction permet d’utiliser une API native qui prend une chaîne en valeur et la modifie sur place sans qu’il soit nécessaire d’utiliser de StringBuilder. Nous vous déconseillons d’utiliser manuellement ce format, dans la mesure où il risque de provoquer une confusion entre les signatures native et managée.

Formats de chaînes orientées Windows

En interagissant avec des interfaces COM ou OLE, vous remarquerez sûrement que les fonctions natives prennent des chaînes comme arguments BSTR. Vous pouvez utiliser le type non managé UnmanagedType.BStr pour marshaler une chaîne comme BSTR.

Si vous communiquez avec des API WinRT, vous pouvez utiliser le format UnmanagedType.HString pour marshaler une chaîne comme HSTRING.

Personnaliser des paramètres de tableau

.NET propose également plusieurs moyens de marshaler des paramètres de tableau. Si vous appelez une API qui accepte un tableau de style C, utilisez le type non managé UnmanagedType.LPArray. Si les valeurs du tableau exigent un marshaling personnalisé, vous pouvez pour cela utiliser le champ ArraySubType sur l’attribut [MarshalAs].

Si vous utilisez les API COM, vous devrez probablement marshaler vos paramètres de tableau comme SAFEARRAY*. Pour cela, vous pouvez utiliser le type non managé UnmanagedType.SafeArray. Le type par défaut des éléments de SAFEARRAY est présenté dans la table Personnaliser des champs object. Vous pouvez utiliser les champs MarshalAsAttribute.SafeArraySubType et MarshalAsAttribute.SafeArrayUserDefinedSubType pour personnaliser précisément le type d’élément de SAFEARRAY.

Personnaliser des paramètres booléens ou décimaux

Pour plus d’informations sur le marshaling des paramètres booléens ou décimaux, voir Personnaliser le marshaling des structures.

Personnaliser des paramètres d’objet (Windows uniquement)

Sous Windows, le runtime .NET propose plusieurs moyens de marshaler des paramètres d’objet en code natif.

Marshaling comme interfaces COM spécifiques

Si votre API accepte un pointeur vers un objet COM, vous pouvez utiliser l’un des formats UnmanagedType suivants sur un paramètre de type object pour indiquer à .NET de marshaler comme ces interfaces spécifiques :

  • IUnknown
  • IDispatch
  • IInspectable

En outre, si votre type est marqué [ComVisible(true)] ou que vous marshalez le type object, vous pouvez utiliser le format UnmanagedType.Interface pour marshaler votre objet comme wrapper appelable COM pour la vue COM de votre type.

Marshaling en VARIANT

Si votre API native accepte une VARIANT Win32, vous pouvez utiliser le format UnmanagedType.Struct sur votre object paramètre pour marshaler vos objets comme VARIANT. Pour connaître les correspondances entre les types .NET et les types VARIANT, voir la documentation Personnaliser les champs object.

Marshalers personnalisés

Si vous voulez projeter une interface COM native dans un autre type managé, vous pouvez utiliser le format UnmanagedType.CustomMarshaler et une implémentation ICustomMarshaler pour fournir votre propre code de marshaling personnalisé.