k92*_*256 5 c# c++ arrays interop unity-game-engine
我试图将一个双数组(它实际上是一个std :: vector,但在转换时转换)从c ++ dll传递到ac#script(unity).使用此处概述的方法/sf/answers/2199314281/.
我可以在我的控制台上成功地获得阵列打印的大小但是我无法使用"CoTaskMemAlloc"来为阵列分配内存,因为我使用Xcode并且它似乎没有COM.
对于更多背景,这个数组是GUI控件的一部分,c ++创建它并且用户使用c#GUI进行编辑 - 因此计划是在编辑时将数组传递回c ++.
C++ code
extern "C" ABA_API void getArray(long* len, double **data){
*len = delArray.size();
auto size = (*len)*sizeof(double);
*data = static_cast<double*>(CoTaskMemAlloc(size));
memcpy(*data, delArray.data(), size);
}
C# code
[DllImport("AudioPluginSpecDelay")]
private static extern void getArray (out int length,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] out double[] array);
int theSize;
double[] theArray;
getArray(out theSize, out theArray);
Run Code Online (Sandbox Code Playgroud)
如果我省略了有关数组的代码,那么int传递就好了.所以我相信这个方法是正确的,它只是绕过缺乏CoTaskMemAlloc.
您应该能够在 XCode 中使用分配内存malloc
并在 C# 中使用Marshal.FreeCoTaskMem
. 但是,为了能够释放它,您需要拥有它的 IntPtr:
C++代码
extern "C" ABA_API void getArray(long* len, double **data)
{
*len = delArray.size();
auto size = (*len)*sizeof(double);
*data = static_cast<double*>(malloc(size));
memcpy(*data, delArray.data(), size);
}
Run Code Online (Sandbox Code Playgroud)
C# 代码
[DllImport("AudioPluginSpecDelay")]
private static extern void getArray(out int length, out IntPtr array);
int theSize;
IntPtr theArrayPtr;
double[] theArray;
getArray(out theSize, out theArrayPtr);
Marshal.Copy(theArrayPtr, theArray, 0, theSize);
Marshal.FreeCoTaskMem(theArrayPtr);
// theArray is a valid managed object while the native array is already freed
Run Code Online (Sandbox Code Playgroud)
编辑
从我收集到的内存管理中,Marshal.FreeCoTaskMem
最有可能使用 实现free()
,因此合适的分配器将是malloc()
.
有两种方法可以真正确定:
Marshal.AllocCoTaskMem
,将其传递给本机以填充它,然后使用 再次在 CLI 中释放它Marshal.FreeCoTaskMem
。malloc()
),但不要在 CLI 中释放内存。相反,使用另一个本机函数,freeArray(double **data)
并在free()
CLI 使用它完成后为您提供数组。