Omówienie marshalingu w języku C++/interfejsie wiersza polecenia

W trybie mieszanym czasami konieczne jest przeprowadzanie marshalingu danych między typami natywnymi i zarządzanymi. Biblioteka marshalingowa ułatwia przeprowadzanie marshalingu i konwertowanie danych w prosty sposób. Biblioteka marshalingowa składa się z zestawu funkcji i marshal_context klasy wykonującej marshaling dla typowych typów. Biblioteka jest zdefiniowana w tych nagłówkach w katalogu include/msclr dla wersji programu Visual Studio:

Nagłówek opis
marshal.h marshal_context funkcje marshalingu bez klas i kontekstu
marshal_atl.h Funkcje do marshalingu typów ATL
marshal_cppstd.h Funkcje do marshalingu standardowych typów języka C++
marshal_windows.h Funkcje do marshalingu typów systemu Windows

Domyślna ścieżka folderu msclr jest podobna do następującej w zależności od używanej wersji i numeru kompilacji:

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

Bibliotekę marshalingową można używać z klasą marshal_context lub bez nich. Niektóre konwersje wymagają kontekstu. Inne konwersje można zaimplementować przy użyciu funkcji marshal_as . Poniższa tabela zawiera listę obsługiwanych bieżących konwersji, niezależnie od tego, czy wymagają kontekstu, oraz jakiego pliku marshala należy uwzględnić:

Z typu Aby wpisać Marshal, metoda Dołącz plik
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 OBSŁUGI marshal_as marshal_windows.h
OBSŁUGI 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^ Znak CStringT<> marshal_as marshal_atl.h
Znak CStringT<> System::String^ marshal_as marshal_atl.h
System::String^ Wchar_t CStringT<> marshal_as marshal_atl.h
Wchar_t CStringT<> System::String^ marshal_as marshal_atl.h
System::String^ Ccombstr marshal_as marshal_atl.h
Ccombstr System::String^ marshal_as marshal_atl.h

Przeprowadzanie marshalingu wymaga kontekstu tylko wtedy, gdy marshalujesz z zarządzanych do natywnych typów danych, a typ natywny, na który jest konwertowany, nie ma destruktora do automatycznego czyszczenia. Kontekst marshalingu niszczy przydzielony natywny typ danych w jego destruktora. W związku z tym konwersje wymagające kontekstu będą prawidłowe tylko do momentu usunięcia kontekstu. Aby zapisać wszystkie wartości marshalowane, należy skopiować wartości do własnych zmiennych.

Uwaga

Jeśli ciąg został osadzony NULLw ciągu, wynik marshalingu ciągu nie jest gwarantowany. Osadzone NULLs mogą spowodować obcięcie ciągu lub ich zachowanie.

W tym przykładzie pokazano, jak dołączyć katalog msclr do deklaracji nagłówka include:

#include "msclr\marshal_cppstd.h"

Biblioteka marshalingowa jest rozszerzalna, dzięki czemu można dodać własne typy marshalingu. Aby uzyskać więcej informacji na temat rozszerzania biblioteki marshalingowej, zobacz How to: Extend the Marshaling Library (Instrukcje: rozszerzanie biblioteki marshalingowej).

Zobacz też

Biblioteka obsługi języka C++
Instrukcje: rozszerzanie biblioteki marshalingu