2010-12-14 1 views
0

Я работаю над обновлением GUI приложения native (MFC) с использованием .NET и WPF. Приложение собирает данные в режиме реального времени, и графический интерфейс должен визуализировать эти данные (в режиме реального времени). Общий план - использовать C++/CLI в качестве уровня взаимодействия между собственным приложением и частью управляемого GUI.Как использовать этот собственный массив в моем классе .NET?

У меня есть собственный класс с байтовыми массивами, содержащий «заголовок», дающий длину массива и тип элементов в нем. Я пытаюсь написать уровень совместимости в C++/CLI между этим родным классом и управляемым .NET-классом.

Я хочу использовать неуправляемый массив байтов в управляемой части приложения. Я несколько ошеломлен информацией о различных блогах и центрах документации. Это контур того, что у меня до сих пор, это вроде как работы, но иногда сбой *. Я не уверен, что это наиболее подходящее решение или даже как правильно его реализовать. Я хотел бы знать, есть ли более подходящий подход?

// Fetch numbers from the native class into unmanaged memory. 
IntPtr ipNumbers = InteropServices::Marshal::AllocHGlobal(sizeof(int) * arrayLength)) 
nativeClass->fetchNumbers((int *) ipNumbers.ToPointer(), arrayLength); 

// Copy data from unmanaged memory into a managed array. 
cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength); 
InteropServices::Marshal::Copy(ipNumbers, numbers, 0, arrayLength); 
InteropServices::Marshal::FreeHGlobal(ipNumbers); 

*) Краш сообщение:. «Windows вызвало точку останова в myprogram.exe Это может быть связано с коррупцией в куче, что указывает на ошибку в myprogram.exe или любой из библиотек DLL он нагруженных . [...] ". Из того, что я могу сказать, это FreeHGlobal, который вызывает сбой.

+0

Ваш код выглядит хорошо, я не знаю, почему это может вызвать сбой, не видя больше вашего кода. Вы можете избежать выделения неуправляемой памяти с помощью pin_ptr в массив чисел и передать это непосредственно в fetchNumbers. –

+0

Вместо этого я изменил код, чтобы использовать pin_ptr чисел, и это похоже на работу. (Я обновляю свой пост с помощью кода.) :-D Я думаю, единственное, что мне нужно знать, это то, что это лучший подход. –

ответ

0

Принимая во внимание предложение Mattias, я изменил код, и теперь он работает.

cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength); 
pin_ptr<int> pp = &numbers[0]; 
nativeClass->fetchNumbers(pp, arrayLength); 
Смежные вопросы