gpt4 book ai didi

c# - 从 C++ 到 C# 的数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:31 25 4
gpt4 key购买 nike

我正在尝试将一个 double 组(它实际上是一个 std::vector,但在传输时转换)从一个 c++ dll 传递到一个 c# 脚本(统一)。使用此处概述的方法 https://stackoverflow.com/a/31418775 .

我可以成功地在我的控制台上统一打印数组的大小,但是我无法使用“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);

如果我省略了有关数组的代码,则 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);
}

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

编辑

来自 Memory Management我收集到 Marshal.FreeCoTaskMem 最有可能使用 free() 实现,因此合适的分配器将是 malloc()

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

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

关于c# - 从 C++ 到 C# 的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com