Как мне использовать этот собственный массив в моем классе .NET? - PullRequest
0 голосов
/ 14 декабря 2010

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

У меня есть собственный класс с массивами байтов, содержащий «заголовок», дающий длину массиваи тип элементов в нем.Я пытаюсь написать слой взаимодействия в 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, что вызывает сбой.

1 Ответ

0 голосов
/ 27 декабря 2010

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

cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength);
pin_ptr<int> pp = &numbers[0];
nativeClass->fetchNumbers(pp, arrayLength);
...