Вызов управляемого кода из неуправляемого и обратный вызов Несмотря на ограничения, описанные в предыдущем разделе, есть несколько способов сотрудничества управляемого и неуправляемого кодов даже в пределах одного исходного файла. Например, приведенная ниже программа демонстрирует, что управляемый код может вызывать неуправляемый. Заметим, что можно передать указатель на элемент данных управляемого класса в качестве параметра методу неуправляемого объекта. Это оказалось возможным благодаря объявлению указателя на управляемый объект с использованием ключевого слова _pin (закрепить). Ключевое слово _pin (закрепить) закрепляет управляемый объект в памяти, запрещая его перемещение в то время, когда неуправляемый код обрабатывает данные. После запуска программы CallingFromManagedToUnmanaged на консоли вы увидите значения 0 и 1, это значит, что метод UnmanagedClassMethod успешно работает с переданным ему закрепленным управляемым объектом. Если из программы удалить ключевое слово _pin (закрепить), при компиляции обнаружится ошибка. В сообщении будет указано, что параметр, переданный в UnmanagedClassMethod нельзя преобразовать из int _gc * (который участвует в сборке мусора) Bint *. //CallingFromManagedToUnmanaged.cpp
Противоположный случай рассмотрен в программе CallingFromUnmanaged-ToManaged. Обратим внимание, что неуправляемый код в главной функции main вызывает управляемую функцию ManagedFunction, которая создает экземпляр управляемого класса ManagedClass и вызывает его метод ManagedClass-Method. К сожалению, неуправляемый код в главной функции main не может непосредственно создать экземпляр класса ManagedClass, так как в неуправляемом коде невозможно обратиться напрямую ни к какому управляемому типу. В этом можно убедиться, раскомментировав последний оператор, в котором создавался бы экземпляр класса ManagedClass. Но здесь компилятор обнаружит ошибку: в неуправляемой функции нельзя объявлять управляемый объект или указатель. Однако в данном примере мы видим, что управляемый код в функции ManagedFunction может создать экземпляр неуправляемого типа UnmanagedClass и передать его в качестве параметра в управляемый метод ManagedClassMethod. Итак, рассмотрим еще один способ взаимодействия управляемого и неуправляемого кода. //CallingFromUnmanagedToManaged.cpp
|