|
Программирование >> Элементы языков с и с++
Глава 14 Преобразование между нерегулируемыми и регулируемыми (режим CLR) указателями На практике часто встречаются случаи, когда требуется переходить от обычных указателей к регулируемым и наоборот (еще говорят переход от native-среды к managed-среде и наоборот ). Этот процесс называют маршаллингом. Среда VC++ содержит специальную библиотеку, предназначенную для этих целей. Эту библиотеку можно использовать без так называемого marshaicontext Class, однако некоторые преобразования требуют наличия этого класса. Другие преобразования используют функцию marshaias о. В табл. 14.1 представлены поддерживаемые преобразования с учетом требования контекста, задаваемого классом marshaicontext class. Таблица 14.1. Преобразование между нерегулируемыми и регулируемыми указателями
Таблица 14.1 (окончание)
Маршаллинг требует контекстного файла только в том случае, когда выполняется преобразование из управляемого типа в родной (native) тип и при этом native-тип, в который идет преобразование, не имеет деструктора для автоматического освобождения памяти от объекта. Вот тогда маршаллинг-контекст разрушает размещенный объект native-типа своим деструктором. Поэтому преобразования, требующие маршаллинг-контекста, действительны только до момента удаления контекста. Чтобы сохранить любое мар-шаллинг-значение, вы должны скопировать его в свою собственную переменную. Если строке присвоено значение nulls, результат преобразования такой строки не гарантируется. Пример 1. Перевод строки String в ASCII-строку Текст программы показан в листинге 14.1, результат - на рис. 14.1. р-................. Листинг 14.1 2008 marshl.срр : main project file. Itinclude stdafx.h Itinclude <stdio.h> * using namespace System; using namespace System::Runtime::InteropServices; ttpragma unmanaged /*сигнал компилятору, что далее следуют unmanaged-функции, работающие с обычными (native) переменными, которые станут размещаться в неуправляемой куче (памяти), за переполнением которой надо следить самому - вовремя освобождать от занимающих ее объектов void NativeTakesAString(const char* p) I printf( (native) received %s\n , p); ttpragma managed /♦сигнал компилятору, что далее следуют managed-функции, работающие со средой CLR, в которой переменные станут размещаться в управляемой куче (памяти), за переполнением которой не надо следить Сс1мому - среда CLR сама позаботится об ее освобождении от занимаемых объектов V . На практике для использования маршаллинга достаточно подключить к вашей программе пространство имен: using namespace System::Runtime::InteropServices.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |