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é NULL
des éléments dans votre chaîne, le résultat du marshaling de la chaîne n’est pas garanti. Les s incorporés NULL
peuvent 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