从C++到C#的数组

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.

Tho*_*ert 6

您应该能够在 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().

有两种方法可以真正确定:

  1. 使用 分配 CLI 中的内存Marshal.AllocCoTaskMem,将其传递给本机以填充它,然后使用 再次在 CLI 中释放它Marshal.FreeCoTaskMem
  2. 保持原样(本机使用 分配内存malloc()),但不要在 CLI 中释放内存。相反,使用另一个本机函数,freeArray(double **data)并在free()CLI 使用它完成后为您提供数组。

  • @k9256 我不确定这是否正确……您将使用一个函数进行分配,并使用不同的(可能不相关的)函数取消分配。至少尝试确保您的代码不会泄漏内存,即使它看起来“有效” (2认同)