Обзор маршалинга в 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 |
Для маршалинга требуется контекст, только если маршалировать из управляемых в собственные типы данных и собственный тип, в который вы преобразуете, не имеет деструктора для автоматической очистки. Контекст маршалинга уничтожает выделенный собственный тип данных в деструкторе. Таким образом, преобразования, требующие контекста, будут допустимы только до удаления контекста. Чтобы сохранить все маршалированные значения, необходимо скопировать значения в собственные переменные.
Примечание.
Если в строке внедрены NULL
s, результат маршалинга строки не гарантируется. Внедренные NULL
s могут привести к усечению строки или их можно сохранить.
В этом примере показано, как включить каталог msclr в объявление заголовка include:
#include "msclr\marshal_cppstd.h"
Библиотека маршалинга расширяема, чтобы можно было добавить собственные типы маршалинга. Дополнительные сведения о расширении библиотеки маршалинга см. в разделе "Практическое руководство. Расширение библиотеки маршалинга".
См. также
Библиотека поддержки C++
Практическое руководство. Расширение библиотеки маршалинга