Übersicht über Marshaling in C++/CLI
Im gemischten Modus müssen Sie die Daten zwischen nativen und verwalteten Typen manchmal marshallen. Die Marshaling-Bibliothek hilft Ihnen, Daten auf einfache Weise zu marshallen und zu konvertieren. Die Marshaling-Bibliothek besteht aus einer Reihe von Funktionen und einer marshal_context
Klasse, die Marshalling für allgemeine Typen durchführt. Die Bibliothek wird in diesen Headern im Include-/msclr-Verzeichnis für Ihre Visual Studio-Edition definiert:
Header | Beschreibung |
---|---|
marshal.h | marshal_context Klassen- und kontextfreie Marshalingfunktionen |
marshal_atl.h | Funktionen zum Marshallen von ATL-Typen |
marshal_cppstd.h | Funktionen für marshallende Standard-C++-Typen |
marshal_windows.h | Funktionen zum Marshallen von Windows-Typen |
Der Standardpfad für den Ordner "msclr " ist in etwa so, je nachdem, welche Edition Sie haben und welche Buildnummer Sie haben:
C:\\Program Files (x86)\\Microsoft Visual Studio\\Preview\\Enterprise\\VC\\Tools\\MSVC\\14.15.26528\\include\\msclr
Sie können die Marshaling-Bibliothek mit oder ohne eine marshal_context Klasse verwenden. Einige Konvertierungen erfordern einen Kontext. Andere Konvertierungen können mithilfe der marshal_as-Funktion implementiert werden. Die folgende Tabelle enthält eine Liste der aktuell unterstützten Konvertierungen und Informationen dazu, ob sie einen Kontext benötigen und welche Marschalldatei Sie hinzufügen müssen:
Von Typ | in Typ | Marschallmethode | Includedatei |
---|---|---|---|
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^ | CStringT-Zeichen<> | marshal_as | marshal_atl.h |
CStringT-Zeichen<> | 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 |
Marshalling erfordert nur einen Kontext, wenn Sie von verwalteten in systemeigene Datentypen marshallen und der systemeigene Typ, den Sie konvertieren, keinen Destruktor zur automatischen Bereinigung besitzt. Der Marshallingkontext zerstört den zugeordneten nativen Datentyp in seinem Destruktor. Daher sind Konvertierungen, die einen Kontext erfordern, nur gültig, bis der Kontext gelöscht wird. Um alle gemarshallten Werte zu speichern, müssen Sie die Werte in Ihre eigenen Variablen kopieren.
Hinweis
Wenn Sie NULL
in die Zeichenfolge eingebettet haben, ist das Ergebnis des Marshallens der Zeichenfolge nicht garantiert. Durch eine eingebettete NULL
kann die Zeichenfolge abgeschnitten oder beibehalten werden.
Dieses Beispiel zeigt, wie das Verzeichnis "msclr" einer Includeheaderdeklaration hinzugefügt wird:
#include "msclr\marshal_cppstd.h"
Die Marshallingbibliothek ist erweiterbar, sodass Sie eigene Marshallingtypen hinzufügen können. Weitere Informationen zum Erweitern der Marshaling-Bibliothek finden Sie unter How to: Extend the Marshaling Library.
Siehe auch
C++-Standardbibliothek
Vorgehensweise: Erweitern der Marshallingbibliothek