Architecture Net



         

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


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(); // ошибка

}

CompEbook.ru Железо, дизайн, обучение и другие




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