メソッドのパラメーターの 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;
}
この場合、Marshal クラスを使用するか、危険にさらす必要があります。
また、配列へのポインターである可能性もあるため、 aref int[] list
が機能する可能性があります。
int** は IntPtr の配列になります。あなたの説明から、C++/CLI を使用して、たとえばアンマネージ int** からマネージ配列への変換を支援することを検討したいと思うかもしれません^> ^