我正在尝试使用第三方DLL,它希望将int **作为方法的参数之一。它将参数描述为指向内存分配的指针的地址。
对不起有任何困惑。我认为参数是双向的。 DLL用于与FPGA板通信,该方法是在主机PC和PCI板之间建立DMA传输。
答案 0 :(得分:7)
使用副评论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;
}
答案 1 :(得分:1)
在这种情况下,您将不得不使用Marshal类或不安全。
它也可能只是一个指向数组的指针,因此ref int[] list
可能有用。
答案 2 :(得分:0)
int **将是和IntPtr的数组,从您的描述中我想您可能希望使用C ++ / CLI来帮助您进行转换,例如从非托管int **到托管数组^&gt; ^