Обзор маршалинга в C++/CLI

В смешанном режиме иногда необходимо маршалить данные между собственными и управляемыми типами. Библиотека маршалинга помогает выполнять маршалинг и преобразовывать данные простым способом. Библиотека маршалинга состоит из набора функций и marshal_context класса, выполняющего маршалинг для распространенных типов. Библиотека определена в этих заголовках в каталоге include/msclr для выпуска Visual Studio:

Заголовок Description
marshal.h marshal_context функции маршалинга без контекста и класса
marshal_atl.h Функции для маршалинга типов ATL
marshal_cppstd.h Функции для маршалинга стандартных типов C++
marshal_windows.h Функции для маршалинга типов Windows

Путь по умолчанию для папки msclr выглядит примерно так, в зависимости от того, какой выпуск у вас есть, и номер сборки:

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

Вы можете использовать библиотеку маршалинга с классом marshal_context или без нее. Для некоторых преобразований требуется контекст. Другие преобразования можно реализовать с помощью функции marshal_as . В следующей таблице перечислены поддерживаемые текущие преобразования, требуется ли контекст и какой маршал-файл необходимо включить:

Из типа Тип Метод Маршал Включить файл
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

Для маршалинга требуется контекст, только если маршалировать из управляемых в собственные типы данных и собственный тип, в который вы преобразуете, не имеет деструктора для автоматической очистки. Контекст маршалинга уничтожает выделенный собственный тип данных в деструкторе. Таким образом, преобразования, требующие контекста, будут допустимы только до удаления контекста. Чтобы сохранить все маршалированные значения, необходимо скопировать значения в собственные переменные.

Примечание.

Если в строке внедрены NULLs, результат маршалинга строки не гарантируется. Внедренные NULLs могут привести к усечению строки или их можно сохранить.

В этом примере показано, как включить каталог msclr в объявление заголовка include:

#include "msclr\marshal_cppstd.h"

Библиотека маршалинга расширяема, чтобы можно было добавить собственные типы маршалинга. Дополнительные сведения о расширении библиотеки маршалинга см. в разделе "Практическое руководство. Расширение библиотеки маршалинга".

См. также

Библиотека поддержки C++
Практическое руководство. Расширение библиотеки маршалинга