2011-07-29 17 views
0

次のC++コードをCシャープにする必要があります。 C++からC#マーシャリング

int* pData = new int[128]; 
for(int i = 0; i < 128; i++) 
{ pData[i] = i*2 ;} 

このpDataをのint *

は後で

今、私はC#でこのすべてを配置する必要があり

* voidとして関数に渡されます。保護されたメモリを読み書きしようとしました:次のように私がやったことは

Int32[] tempData = new Int32[128]; 
for(int i = 0; i < 128; i++) 
{ tempData[i] = i*2 ;} 
int size = Marshal.SizeOf(tempData[0]) * tempData.Length; 
IntPtr ptrData = Marshal.AllocHGlobal(size); 
Marshal.Copy(tempData, 0, ptrData, tempData.Length); 

後、私は、私は、実行時エラーを取得するC#のfunction.ButにptrDataを渡し、です。これはしばしば、他のメモリが壊れていることを示します。

ありがとうございました。トリックを行う必要があります

+1

は、のPInvokeのマーシャラーは、すでにこれを行います。バグはこのコードではない、私は[DllImport]宣言が悪いと思います。そのネイティブコードでは、AVで多くのヘルプを爆破する必要はありません。デバッガを使用し、アンマネージコードのデバッグを有効にします。 –

+0

マーシャルコピーの長さは間違いなく短すぎます。長さは配列のサイズですが、intのサイズで乗算する必要があります。 – weismat

+0

マーシャルのトリックが 'int * pData = new int [128];'と 'int pData [128];'のままであれば少しチェックする必要がありますか? – control

答えて

2
int size = sizeof(int) * tempData.Length; 
IntPtr ptrData = Marshal.AllocHGlobal(size); 
Marshal.Copy(tempData, 0, ptrData, size); 

...あなたはあまりにも多くを支援している

+1

最後のparamは正しいと思います。Marshal.Copy(tempData、0、ptrData、tempData.Length);; [ref.msdn](http://msdn.microsoft.com/en-us/library/ ms146629.aspx) – control

関連する問題