将动态数组编组到C#委托(回调)

时间:2014-11-06 15:14:52

标签: c# .net pinvoke

我有一些本地C / C ++代码,它们将C#委托称为回调。传递动态数组参数的最佳做法是什么?实际上C指针是struct的数据成员,我将结构传递给回调。

使用IntPtr做这样的事情可以吗?

struct Data {
    ... (other data members)
    double* array;
    int size;
};

Array是指向在我的C ++代码中分配的数组的指针(只需调用newmalloc)。在C#方面,代表期望

struct Data {
    ... (other data members)
    IntPtr array;
    int size;
}

我关心的是......应IntPtr使用Marshal.AllocHGlobal分配内存,还是在我的C ++代码(newmalloc中分配内存时也是安全的?

1 个答案:

答案 0 :(得分:3)

使用IntPtr是正确的。内存已分配,并在非托管端解除分配。因此,您应该在管理方面做与分配和解除分配无关的任何事情。

只需使用Marshal.Copy读取或写入数组即可。或者,如果您更喜欢使用unsafe块并将IntPtr解释为double*