Ü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