DLLImport Int **-可能であればこれを行う方法
質問
メソッドのパラメータの1つとしてint **を必要とするサードパーティDLLを使用しようとしています。メモリー割り当てを指すポインターのアドレスとしてパラメーターを記述します。
混乱をおかけして申し訳ありません。パラメータは双方向だと思います。 DLLはFPGAボードと通信するためのもので、メソッドはホストPCとPCIボード間のDMA転送をセットアップします。
解決
by-ref System.IntPtr
。
[DllImport("thirdparty.dll")]
static extern long ThirdPartyFunction(ref IntPtr arg);
long f(int[] array)
{ long retval = 0;
int size = Marshal.SizeOf(typeof(int));
var ptr = IntPtr.Zero;
try
{ ptr = Marshal.AllocHGlobal(size * array.Length);
for (int i= 0; i < array.Length; ++i)
{ IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
Marshal.StructureToPtr(array, tmpPtr, false);
}
retval = ThirdPartyFunction(ref ptr);
}
finally
{ if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
}
return retval;
}
他のヒント
この場合、マーシャルクラスを使用するか、安全でない状態にする必要があります。
また、単なる配列へのポインタである可能性があるため、 ref int []リスト
が機能する可能性があります。
int **はIntPtrの配列です。説明から、C ++ / CLIを使用して、たとえばアンマネージint **からマネージ配列への変換を支援したいと思うかもしれません^&gt; ^
所属していません StackOverflow