【发布时间】:2008-10-16 16:11:56
【问题描述】:
我正在尝试使用第三方 DLL,该 DLL 需要一个 int** 作为该方法的参数之一。它将参数描述为指向内存分配的指针的地址。
如有任何混淆,我们深表歉意。我认为参数是双向的。 DLL 用于与 FPGA 板通信,方法是在主机 PC 和 PCI 板之间建立 DMA 传输。
【问题讨论】:
标签: c# interop pinvoke dllimport
我正在尝试使用第三方 DLL,该 DLL 需要一个 int** 作为该方法的参数之一。它将参数描述为指向内存分配的指针的地址。
如有任何混淆,我们深表歉意。我认为参数是双向的。 DLL 用于与 FPGA 板通信,方法是在主机 PC 和 PCI 板之间建立 DMA 传输。
【问题讨论】:
标签: c# interop pinvoke dllimport
使用 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 类或变得不安全。
它也可能只是一个指向数组的指针,所以 ref int[] list 可能会起作用。
【讨论】:
一个 int** 将是 IntPtr 的数组,根据您的描述,我认为您可能想研究使用 C++/CLI 来帮助您进行转换,例如从非托管 int** 到托管数组^>^
【讨论】: