На этом шаге мы приведем программу, реализующую указанное преобразование.
В данном примере показана работа с native-структурой в managed-функции. Текст программы приведен ниже, результат - на рисунке 1.
// 216_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> #include <math.h> using namespace System; using namespace System::Runtime::InteropServices; #pragma unmanaged //native-структура: struct Location { int x; int y; }; //параметры функции - два экземпляра структуры: double GetDistance(Location loc1, Location loc2) { printf("[unmanaged] loc1(%d, %d)", loc1.x, loc1.y); printf(" loc2(%d, %d)\n", loc2.x, loc2.y); double h = loc1.x - loc2.x; double v = loc1.y = loc2.y; //квадратный корень из h*h + v*v: double dist = sqrt( pow(h, 2) + pow(v, 2) ); return dist; } //параметр функции - указатель на структуру void InitLocation(Location* lp) { printf("[unmanaged] Initializing location...\n"); lp->x = 50; lp->y = 50; } #pragma managed //работа со стуктурой в managed-функции: void main() { Location loc1; loc1.x = 0; loc1.y = 0; Location loc2; loc2.x = 100; loc2.y = 100; //вызов native-функции в managed-функции: double dist = GetDistance(loc1, loc2); Console::WriteLine("[managed] distance = {0}", dist); Location loc3; //вызов native-функции в managed-функции //в ее параметре указатель, поэтому берется //адрес экземпляра структур! InitLocation(&loc3); Console::WriteLine("[managed] x={0} у={1}", loc3.x, loc3.y); Console::ReadLine(); }
Рис.1. Маршаллинг структуры
На следующем шаге мы рассмотрим работу с массивом элементов native-структуры в managed-функции.