Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Lorsque le comportement de marshalling des paramètres par défaut du runtime .NET ne répond pas à vos besoins, vous pouvez utiliser l'attribut System.Runtime.InteropServices.MarshalAsAttribute pour personnaliser la méthode de marshalling de vos paramètres. 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 ne respecte qu'un petit sous-ensemble de MarshalAsAttribute appliqué aux paramètres. Il est plutôt recommandé d’utiliser MarshalUsingAttribute pour l’interopérabilité générée par la source. Pour plus d’informations, reportez-vous à Le marshaling personnalisé pour la génération de code source.
Personnalisation 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 sections distinctes sur les chaînes de style C et les formats de chaînes centrés sur Windows.
Chaînes de style C
Chacun de ces formats transmet une chaîne terminée par null au code natif. Ils diffèrent par l’encodage de la chaîne de caractères native.
valeur System.Runtime.InteropServices.UnmanagedType |
Codage |
|---|---|
| LPStr | Institut national américain des normes (ANSI) |
| LPUTF8Str | UTF-8 |
| LPWStr | UTF-16 |
| LPTStr | UTF-16 |
Le UnmanagedType.VBByRefStr format est légèrement différent. Comme LPWStr, il convertit la chaîne en une chaîne C native encodée en UTF-16. Toutefois, la signature managée vous permet de transmettre la chaîne par référence et la signature native correspondante prend la chaîne par valeur. Cette distinction vous permet d’utiliser une API native qui prend une chaîne par valeur et la modifie sur place sans avoir à utiliser un StringBuilder. Nous vous déconseillons d’utiliser manuellement ce format, car il est susceptible de provoquer une confusion en raison de l’incompatibilité entre les signatures natives et gérées.
Formats de chaîne centrés sur Windows
Lorsque vous interagissez avec des interfaces COM ou OLE, vous constaterez probablement que les fonctions natives prennent des chaînes en tant qu’arguments BSTR . Vous pouvez utiliser le type non managé UnmanagedType.BStr pour marshaler une chaîne comme BSTR.
Si vous interagissez avec des API WinRT, vous pouvez utiliser le format UnmanagedType.HString pour convertir une chaîne en tant que HSTRING.
Personnaliser les paramètres de tableau
.NET vous offre également plusieurs façons de gérer les paramètres de tableau. Si vous appelez une API qui prend un tableau de style C, utilisez le UnmanagedType.LPArray type non managé. Si les valeurs du tableau ont besoin d’un marshaling personnalisé, vous pouvez utiliser le ArraySubType champ sur l’attribut [MarshalAs] pour cela.
Si vous utilisez les API COM, vous devrez probablement marshaler vos paramètres de tableau comme SAFEARRAY*. Pour ce faire, vous pouvez utiliser le UnmanagedType.SafeArray type non managé. Le type par défaut des éléments du tableau SAFEARRAY est visible dans la table sur la personnalisation des object champs. Vous pouvez utiliser les champs MarshalAsAttribute.SafeArraySubType et MarshalAsAttribute.SafeArrayUserDefinedSubType pour personnaliser le type d’élément exact du SAFEARRAY.
Personnalisation des paramètres booléens ou décimaux
Pour plus d'informations sur le mappage des paramètres booléens ou décimaux, consultez Personnalisation du mappage des structures.
Personnalisation des paramètres d’objet (Windows uniquement)
Sur Windows, le runtime .NET fournit plusieurs façons de marshaler les 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 :
IUnknownIDispatchIInspectable
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 un Win32 VARIANT, vous pouvez utiliser le format UnmanagedType.Struct sur votre paramètre object pour marshaler vos objets en VARIANT. Consultez la documentation sur la customisation des object champs pour un mappage entre les types .NET et VARIANT types.
Marshaleurs personnalisés
Si vous souhaitez projeter une interface COM native dans un autre type managé, vous pouvez utiliser le format UnmanagedType.CustomMarshaler et une implémentation de ICustomMarshaler pour fournir votre propre code de marshaling personnalisé.