Übersicht über das Marshaling in C++
Im gemischten Modus müssen Sie die Daten zwischen systemeigenen und verwalteten Typen manchmal marshallen. Mit Visual Studio 2008 wurde die Marshallingbibliothek eingeführt, mit der Sie Daten auf einfache Weise marshallen und konvertieren können.
Sie können die Marshallingbibliothek 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<char> |
marshal_as |
marshal_atl.h |
CStringT<char> |
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 systemeigenen 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.
Die Marshallingbibliotheksheader sind im Includeverzeichnis im Unterverzeichnis "msclr" gespeichert. 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 Marshallingbibliothek finden Sie unter Gewusst wie: Erweitern der Marshallingbibliothek.
In früheren Versionen konnten Sie Daten mithilfe eines Plattformaufrufs marshallen. Weitere Informationen über PInvoke finden Sie unter Aufrufen systemeigener Funktionen aus verwaltetem Code.
Siehe auch
Aufgaben
Gewusst wie: Erweitern der Marshallingbibliothek