C# DLLImport Int**-如果可以,如何执行此操作
我正在尝试使用第三方DLL,它希望int**作为方法的参数之一。它将参数描述为指向内存分配的指针的地址 对不起,有什么困惑。我认为这个参数是双向的。DLL用于与FPGA板对话,方法是在主机PC和PCI板之间设置DMA传输。使用by refC# DLLImport Int**-如果可以,如何执行此操作,c#,interop,pinvoke,dllimport,C#,Interop,Pinvoke,Dllimport,我正在尝试使用第三方DLL,它希望int**作为方法的参数之一。它将参数描述为指向内存分配的指针的地址 对不起,有什么困惑。我认为这个参数是双向的。DLL用于与FPGA板对话,方法是在主机PC和PCI板之间设置DMA传输。使用by ref [DllImport(“thirdparty.dll”)] 静态外部长第三方功能(参考IntPtr参数); 长f(int[]数组) {long retval=0; int size=Marshal.SizeOf(typeof(int)); var ptr=In
[DllImport(“thirdparty.dll”)]
静态外部长第三方功能(参考IntPtr参数);
长f(int[]数组)
{long retval=0;
int size=Marshal.SizeOf(typeof(int));
var ptr=IntPtr.Zero;
尝试
{ptr=Marshal.AllocHGlobal(size*array.Length);
for(int i=0;i
在这种情况下,您必须使用封送处理类,否则将变得不安全
它也可能只是一个指向数组的指针,因此
ref int[]list
可能会起作用。一个int**可能是一个IntPtr的数组,根据您的描述,我想您可能想研究一下如何使用C++/CLI来帮助您进行转换,例如从非托管int**到托管数组^>^如何转换int[]到IntPtr?使用ref 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;
}