На этом шаге мы приведем общие сведения о маршаллизации.
На практике часто встречаются случаи, когда требуется переходить от обычных указателей к регулируемым и наоборот (еще говорят "переход от native-среды к managed-среде и наоборот"). Этот процесс называют маршаллингом (маршаллизацией). Среда VC++ содержит специальную библиотеку, предназначенную для этих целей. Эту библиотеку можно использовать без так называемого marshal_context Class, однако некоторые преобразования требуют наличия этого класса. Другие преобразования используют функцию marshal_as().
В таблице 1 представлены поддерживаемые преобразования с учетом требования контекста, задаваемого классом marshal_context Class.
Из типа | В тип | Marshal-метод | Какой файл надо подключать (Include file) |
---|---|---|---|
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 |
Маршаллинг требует контекстною файла только в том случае, когда выполняется преобразование из управляемого типа в родной (native), нерегулируемый тип и при этом native-тип, в который идет преооразование, не имеет деструктора для автоматического освобождения памяти от объекта. Вот тогда маршаллинг-контекст разрушает размещенный объект native-типа своим деструктором. Поэтому преобразования, требующие маршаллинг-контекста, действительны только до момента удаления контекста. Чтобы сохранить любое маршаллинг-значение, вы должны скопировать его в свою собственную переменную. Если строке присвоено значение NULLs, результат преобразования такой строке не гарантируется.
На практике для использования маршаллинга достаточно подключить к программе пространство имен:
using namespace System::Runtime::InteropServices .
На следующем шаге мы рассмотрим перевод строки String^ в ASCII-строку.