передать элемент данных управляемого объекта
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 Железо, дизайн, обучение и другие
Содержание Назад Вперед