2010-12-14 48 views
0

我正在使用.NET和WPF更新本機(MFC)應用程序的GUI。應用程序實時收集數據,GUI應該可視化數據(實時)。整體計劃是使用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分配非託管內存給numbers數組,並將其直接傳遞給fetchNumbers。 – 2010-12-14 12:48:21

+0

我改變了代碼來使用一個pin_ptr的數字,而這似乎工作。 (我會用代碼更新我的帖子。):-D我想我唯一需要知道的是如果這是最好的方法。 – 2010-12-14 13:14:19

回答

0

考慮到Mattias的建議我改變了代碼,現在它正在工作。

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