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