на начало
На главную страницу
Форум   

Вызов управляемого кода из неуправляемого и обратный вызов

страницы в данном разделе 
» Глава 15. Смешивание управляемого и неуправляемого кода » Смешивание управляемого и неуправляемого кода
» Сравнение управляемого и неуправляемого кода » Причины смешивания управляемого и неуправляемого кодов
» Неуправляемый или опасный? » Управляемые и неуправляемые ссылки и типы значений
» Ограничения на использование управляемых типов в C++ » Вызов управляемого кода из неуправляемого и обратный вызов
» Сравнение программирования на C++ с использованием модели компонентных объектов Microsoft (COM) и .NET » Доступ из управляемого кода к компонентам, построенным на основе модели компонентных объектов Microsoft (COM)
» Сервисная программа Tibinp. ехе » Унаследованный компонент на основе модели компонентных объектов Microsoft (COM)
» Действующий клиент на основе модели компонентных объектов Microsoft (COM) » Создание клиента на основе модели компонентных объектов Microsoft (COM) с помощью управляемого C++
» Разработка управляемого клиента на основе модели компонентных объектов Microsoft (COM) с помощью С# » Создание с помощью управляемого C++ клиента на основе модели компонентных объектов Microsoft (COM) без метаданных
» Создание с помощью С# управляемого клиента на основе модели компонентных объектов Microsoft (COM) без метаданных » Доступ к управляемым компонентам из клиентов на основе модели компонентных объектов Microsoft (COM)
» Раннее связывание клиента на основе модели компонентных объектов Microsoft (COM) с компонентами .NET » Динамическое связывание клиента на основе модели компонентных объектов Microsoft (COM) с компонентами .NET
» Явное определение интерфейса » Службы обращения к платформе: Plnvoke (Platform Invocation Services)
» Резюме »  

Статья :: Вызов управляемого кода из неуправляемого и обратный вызов

Вызов управляемого кода из неуправляемого и обратный вызов

Вызов управляемого кода из неуправляемого и обратный вызов

Несмотря на ограничения, описанные в предыдущем разделе, есть несколько способов сотрудничества управляемого и неуправляемого кодов даже в пределах одного исходного файла. Например, приведенная ниже программа демонстрирует, что управляемый код может вызывать неуправляемый. Заметим, что можно передать указатель на элемент данных управляемого класса в качестве параметра методу неуправляемого объекта. Это оказалось возможным благодаря объявлению указателя на управляемый объект с использованием ключевого слова _pin (закрепить). Ключевое слово _pin (закрепить) закрепляет управляемый объект в памяти, запрещая его перемещение в то время, когда неуправляемый код обрабатывает данные. После запуска программы CallingFromManagedToUnmanaged на консоли вы увидите значения 0 и 1, это значит, что метод UnmanagedClassMethod успешно работает с переданным ему закрепленным управляемым объектом. Если из программы удалить ключевое слово _pin (закрепить), при компиляции обнаружится ошибка. В сообщении будет указано, что параметр, переданный в UnmanagedClassMethod нельзя преобразовать из int _gc * (который участвует в сборке мусора) Bint *.

//CallingFromManagedToUnmanaged.cpp
fusing <mscorlib.dll>
using namespace System;
// использование пространства имен Система;
Jpragma managed
// pragma управляемый
_gc class ManagedClass
// класс сборщика мусора ManagedClass - управляемый класс
{ public:
int x;
};
tpragma unmanaged
// pragma неуправляемый
_nogc class UnmanagedClass
// класс UnmanagedClass - неуправляемый класс
{
public:
void UnmanagedClassMethod(int *px)
{
// px указывает на элемент данных х управляемого объекта
//но этот объект закреплен, поэтому неуправляемый код
// может безопасно обратиться к элементу данных х *рх = 1;
// изменяет значение, чтобы доказать,
// что это работало
}
};
ipragma managed
// pragma управляемый
void main(void)
{
ManagedClass _pin *pmcObj = new ManagedClass();
UnmanagedClass *pumcObj = new UnmanagedClass() ;
pmcObj->x = 0;
Console::WriteLine(pmcObj->x);
// до: О
// передать элемент данных управляемого объекта
// неуправляемому коду
pumcObj->UnmanagedClassMethod(&pmcObj->x);
Console::WriteLine(pmcObj->x);
// после: 1
}

Противоположный случай рассмотрен в программе CallingFromUnmanaged-ToManaged. Обратим внимание, что неуправляемый код в главной функции main вызывает управляемую функцию ManagedFunction, которая создает экземпляр управляемого класса ManagedClass и вызывает его метод ManagedClass-Method. К сожалению, неуправляемый код в главной функции main не может непосредственно создать экземпляр класса ManagedClass, так как в неуправляемом коде невозможно обратиться напрямую ни к какому управляемому типу. В этом можно убедиться, раскомментировав последний оператор, в котором создавался бы экземпляр класса ManagedClass. Но здесь компилятор обнаружит ошибку: в неуправляемой функции нельзя объявлять управляемый объект или указатель. Однако в данном примере мы видим, что управляемый код в функции ManagedFunction может создать экземпляр неуправляемого типа UnmanagedClass и передать его в качестве параметра в управляемый метод ManagedClassMethod. Итак, рассмотрим еще один способ взаимодействия управляемого и неуправляемого кода.

//CallingFromUnmanagedToManaged.cpp
#using <mscorlib.dll>
using namespace System;
// использование пространства имен Система;
#pragma unmanaged
// pragma неуправляемый
_nogc class UnmanagedClass
// класс UnmanagedClass - неуправляемый класс
{
public:
int x; };
#pragma managed
// pragma управляемый
_gc class ManagedClass
// класс сборщика мусора ManagedClass - управляемый класс
{
public:
void ManagedClassMethod(UnmanagedClass *pumcObject) {
// pumcObject указывает на неуправляемый объект pumcObject->x =1; // изменяет значение, чтобы доказать,
// что это работало } };
void ManagedFunction() {
ManagedClass *pmcObj = new ManagedClass();
UnmanagedClass *pumcObj = new UnmanagedClass();
pumcObj->x = 0;
Console::WriteLine(pumcObj->x); //до: О
pmcObj->ManagedClassMethod(pumcObj);
Console::WriteLine(pumcObj->x); //после: 1 }
Ipragma unmanaged
// pragma неуправляемый
void main(void)
{
ManagedFunction(}; //вызов управляемого из неуправляемого //ManagedClass *pmcObj = new ManagedClass(); // ошибка
}



Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)



PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C





 
© faq.pp.ru, справочник программиста
Яндекс цитирования