编组const浮动**的正确方法是什么?

时间:2016-11-15 02:01:32

标签: c# pinvoke marshalling

我正在尝试读取通过从C#中调整dll函数创建的数组。当我打印出数组的内容时,它实际上充满了垃圾。

我怀疑这种情况正在发生,因为我错误地将const float**编组为out IntPtr。你如何正确地组织const float**

DLL C ++接口

int Foo(void *objPtr, uint64_t *resultLen, const float **result);

DLL导入声明

[DllImport("foo.dll", CharSet = CharSet.Auto)]
public static extern int Foo(IntPtr objPtr, out ulong resultLen, out IntPtr result);

致电代码

IntPtr objPtr = getObj();
IntPtr result;
ulong resultLen;
int output = Foo(objPtr, out resultLen, out result); 

1 个答案:

答案 0 :(得分:3)

因为没有办法提前告诉编组程序数组的大小,所以必须手动复制数组。所以out IntPtr是正确的。

请注意,出现非常大的数组问题。请参阅https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspxHow to get around Marshal.Copy (32bit) length limit?。此代码段将使用int作为结果数组长度。您将需要弄清楚在您的特定情况下该怎么做。

另请注意,您的DLL必须负责释放它分配的内存。请参阅Release unmanaged memory from managed C# with pointer of it

IntPtr objPtr = getObj();
IntPtr result;
int resultLen;

// call your external function
int output = Foo(objPtr, out resultLen, out result); 

// create an array to hold the output data
float[] array = new float[resultLen];

// copy the data
Marshal.Copy(result, array, 0, resultLen);

// since the memory was allocated by the DLL only it knows how to free it
// so call the free function exported by the DLL
FreeBufferAfterFoo(result);