正在将动态数组封送至C#委托(回调)

本文关键字:委托 回调 动态 数组 | 更新日期: 2023-09-27 18:29:20

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

IntPtr做这样的事情可以吗?

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

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

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

我担心的是…IntPtr应该使用Marshal.AllocHGlobal分配内存吗?或者,如果它是在我的C++代码(newmalloc)中分配的内存,它是否也安全?

正在将动态数组封送至C#委托(回调)

使用IntPtr是正确的。内存在非托管端进行分配和解除分配。因此,您不应该在托管端执行与分配和释放相关的任何操作。

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