Partager via


Vue d’ensemble du marshaling en C++/CLI

En mode mixte, vous devez parfois marshaler vos données entre les types natifs et managés. La bibliothèque de marshaling vous permet de marshaler et de convertir des données de manière simple. La bibliothèque de marshaling se compose d’un ensemble de fonctions et d’une marshal_context classe qui effectuent le marshaling pour les types courants. La bibliothèque est définie dans ces en-têtes dans le répertoire include/msclr de votre édition Visual Studio :

En-tête Description
marshal.h marshal_context fonctions de marshaling sans classe et sans contexte
marshal_atl.h Fonctions pour marshaler les types ATL
marshal_cppstd.h Fonctions pour marshaler les types C++ standard
marshal_windows.h Fonctions pour marshaler les types Windows

Le chemin d’accès par défaut pour le dossier msclr est similaire à celui-ci en fonction de l’édition que vous avez et du numéro de build :

C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Enterprise\\VC\\Tools\\MSVC\\14.15.26528\\include\\msclr

Vous pouvez utiliser la bibliothèque de marshaling avec ou sans classe marshal_context. Certaines conversions nécessitent un contexte. D’autres conversions peuvent être implémentées à l’aide de la fonction marshal_as . Le tableau suivant répertorie les conversions actuelles prises en charge, qu’elles nécessitent un contexte et le fichier de marshaling que vous devez inclure :

À partir du type Pour taper Marshaler la méthode Inclut le fichier
System ::String^ const char* marshal_context marshal.h
const char* System ::String^ marshal_as marshal.h
char * System ::String^ marshal_as marshal.h
System ::String^ const wchar_t* marshal_context marshal.h
const wchar_t* System ::String^ marshal_as marshal.h
wchar_t * System ::String^ marshal_as marshal.h
System ::IntPtr HANDLE marshal_as marshal_windows.h
HANDLE System ::IntPtr marshal_as marshal_windows.h
System ::String^ BSTR marshal_context marshal_windows.h
BSTR System ::String^ marshal_as marshal.h
System ::String^ bstr_t marshal_as marshal_windows.h
bstr_t System ::String^ marshal_as marshal_windows.h
System ::String^ std ::string marshal_as marshal_cppstd.h
std ::string System ::String^ marshal_as marshal_cppstd.h
System ::String^ std::wstring marshal_as marshal_cppstd.h
std::wstring System ::String^ marshal_as marshal_cppstd.h
System ::String^ Char CStringT<> marshal_as marshal_atl.h
Char CStringT<> System ::String^ marshal_as marshal_atl.h
System ::String^ CStringT<wchar_t> marshal_as marshal_atl.h
CStringT<wchar_t> System ::String^ marshal_as marshal_atl.h
System ::String^ CComBSTR marshal_as marshal_atl.h
CComBSTR System ::String^ marshal_as marshal_atl.h

Le marshaling nécessite un contexte uniquement lorsque vous marshalez des types de données managés vers des types de données natifs et que le type natif que vous convertissez en n’a pas de destructeur pour le nettoyage automatique. Le contexte de marshaling détruit le type de données natif alloué dans son destructeur. Par conséquent, les conversions qui nécessitent un contexte ne seront valides que jusqu’à ce que le contexte soit supprimé. Pour enregistrer les valeurs marshalées, vous devez copier les valeurs dans vos propres variables.

Remarque

Si vous avez incorporé NULLdes éléments dans votre chaîne, le résultat du marshaling de la chaîne n’est pas garanti. Les s incorporés NULLpeuvent entraîner la troncation de la chaîne ou elles peuvent être conservées.

Cet exemple montre comment inclure le répertoire msclr dans une déclaration d’en-tête Include :

#include "msclr\marshal_cppstd.h"

La bibliothèque de marshaling est extensible pour pouvoir ajouter vos propres types de marshaling. Pour plus d’informations sur l’extension de la bibliothèque de marshaling, consultez Guide pratique pour étendre la bibliothèque de marshaling.

Voir aussi

Bibliothèque de prise en charge C++
Guide pratique pour étendre la bibliothèque de marshaling