Язык С/С++. Преобразование между регулируемыми и нерегулируемыми указателями (общие сведения)

   
На этом шаге мы приведем общие сведения о маршаллизации.

   
На практике часто встречаются случаи, когда требуется переходить от обычных указателей к регулируемым и наоборот (еще говорят "переход от native-среды к managed-среде и наоборот").
Этот процесс называют маршаллингом (маршаллизацией). Среда VC++ содержит специальную библиотеку, предназначенную для этих целей. Эту библиотеку можно использовать без так
называемого marshal_context Class, однако некоторые преобразования требуют наличия этого класса. Другие преобразования используют функцию marshal_as().

   
В таблице 1 представлены поддерживаемые преобразования с учетом требования контекста, задаваемого классом marshal_context Class.

Таблица 1. Преобразование между нерегулируемыми и регулируемыми указателями

Из типаВ типMarshal-методКакой файл надо подключать (Include file)
System::String^const char *marshal_contextmarshal.h
const char *System::String^marshal_asmarshal.h
char *System::String^marshal_asmarshal.h
System::String^const wchar_t*marshal_contextmarshal.h
const wchar_t*System::String^marshal_asmarshal.h
wchar_t*System::String^marshal_asmarshal.h
System::IntPtrHANDLEmarshal_asmarshal_windows.h
HANDLESystem::IntPtrmarshal_asmarshal_windows.h
System::String^BSTRmarshal_contextmarshal_windows.h
BSTRSystem::String^marshal_asmarshal.h
System::String^bstr_tmarshal_asmarshal_windows.h
bstr_tSystem::String^marshal_asmarshal_windows.h
System::String^std::stringmarshal_asmarshal_cppstd.h
std::stringSystem::String^marshal_asmarshal_cppstd.h
System::String^std::wstringmarshal_asmarshal_cppstd.h
std::wstringSystem::String^marshal_asmarshal_cppstd.h
System::String^CStringT<char>marshal_asmarshal_atl.h
CStringT<char>System::String^marshal_asmarshal_atl.h
System::String^CStringT<wchar_t>marshal_asmarshal_atl.h
CStringT<wchar_t>System::String^marshal_asmarshal_atl.h
System::String^CComBSTRmarshal_asmarshal_atl.h
CComBSTRSystem::String^marshal_asmarshal_atl.h

   
Маршаллинг требует контекстною файла только в том случае, когда выполняется преобразование из управляемого типа в родной (native), нерегулируемый тип и при этом native-тип,
в который идет преооразование, не имеет деструктора для автоматического освобождения памяти от объекта. Вот тогда маршаллинг-контекст разрушает размещенный объект native-типа
своим деструктором. Поэтому преобразования, требующие маршаллинг-контекста, действительны только до момента удаления контекста. Чтобы сохранить любое маршаллинг-значение, вы должны
скопировать его в свою собственную переменную. Если строке присвоено значение NULLs, результат преобразования такой строке не гарантируется.

   
На практике для использования маршаллинга достаточно подключить к программе пространство имен:

  using namespace System::Runtime::InteropServices    .

   
На следующем шаге мы рассмотрим перевод строки String^ в ASCII-строку.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий