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 | UCHWYT | marshal_as | marshal_windows.h |
UCHWYT | 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 NULL
w ciągu, wynik marshalingu ciągu nie jest gwarantowany. Osadzone NULL
s 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