封送const float的正确方法是什么?

本文关键字:方法 是什么 const float 封送 | 更新日期: 2023-09-27 18:17:59

我正试图读取一个数组,这是从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); 

封送const float的正确方法是什么?

由于无法提前告诉封送处理程序数组的大小,因此必须手动复制数组。所以out IntPtr是正确的。

注意在处理非常大的数组时会遇到问题。请参阅https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx和如何绕过Marshal。拷贝(32位)长度限制?。这个代码片段将使用int作为生成的数组长度。你需要弄清楚在你的特殊情况下该怎么做。

还要注意你的DLL必须负责释放它分配的内存。参见使用指针从托管c#中释放非托管内存。

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);