2010-12-14 8 views
0

私は、.NETとWPFを使用してネイティブ(MFC)アプリケーションのGUIを更新しています。アプリケーションはリアルタイムでデータを収集し、GUIはそのデータを(リアルタイムで)視覚化することになっています。全体的な計画は、ネイティブアプリケーションと管理対象GUI部分の間の相互運用性層としてC++/CLIを使用することです。.NETクラスでこのネイティブ配列を使用するにはどうすればよいですか?

私は、配列の長さとその中の要素の型を与える "ヘッダ"を含むバイト配列を持つネイティブクラスを持っています。私は、このネイティブクラスとマネージド.NETクラスの間のC++/CLIに相互運用性レイヤーを記述しようとしています。

アプリケーションの管理対象部分でアンマネージバイト配列を使用したいと考えています。私は、さまざまなブログやドキュメントセンターの情報に多少なりとも圧倒されています。これは私が今までに持っているものの概要です。作品の種類はありますが、時にはクラッシュすることもあります。私はこれが最も適切な解決策であるかどうか、あるいはそれを適切に実装する方法さえわからない。より適切なアプローチがあるかどうかを知りたいですか?

// 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); 
関連する問題