Architecture Net



         

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


Несмотря на ограничения, описанные в предыдущем разделе, есть несколько способов сотрудничества управляемого и неуправляемого кодов даже в пределах одного исходного файла. Например, приведенная ниже программа демонстрирует, что управляемый код может вызывать неуправляемый. Заметим, что можно передать указатель на элемент данных управляемого класса в качестве параметра методу неуправляемого объекта. Это оказалось возможным благодаря объявлению указателя на управляемый объект с использованием ключевого слова _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;




Содержание  Назад  Вперед