【问题标题】:C# interop : handling pointer-array in unmanaged structC# 互操作:在非托管结构中处理指针数组
【发布时间】:2010-08-10 07:51:57
【问题描述】:

我正在包装一些对非托管 Aubio 库 dll (Aubio.org) 的调用, 我想知道处理 Aubio 样本缓冲区的好方法是什么。

它是这样定义的:

// Buffer for real values
struct _fvec_t {
  uint length;    // length of buffer
  uint channels;  // number of channels
  float **data;   // data array of size [length] * [channels]
};

Aubio 为我创建了正确设置数据成员的结构,因此我得到了一个 IntPtr。 我需要从我的 C# 代码中读取/写入数据指针。

for (int chan_idx = 0; chan_idx < my_fvec.channels; ++chan_idx)
    for (int i=0; i<something; i++)
       my_fvec.data[chan_idx][i] = SomeRandomValue();

将 C# 结构“映射”到 fvec_t 类型以便我可以正确访问数据成员以读取/写入它的正确方法是什么?

(或者我应该使用 Marshal.Copy,以及如何使用指针数组来做到这一点?)

【问题讨论】:

  • 只是 Marshal.Copy 方法的一个想法:如果它是一个指针数组,您可以将数据指针编组到 IntPtr 数组,然后分别编组每个 IntPtr。不知道这是否是最好的主意。
  • 我同意 OregonGhost。或者在 C# 中使用不安全代码和“真实”指针。

标签: c# pointers interop unmanaged


【解决方案1】:

我想你可以定义一个托管结构和 PtrToStructure 你有什么,修改,然后 StructureToPtr (回到相同的位置),但它可能同样简单,因为内存已经分配,​​所有,只是读出数组的 intptr,然后使用 Copy 将浮点数组写入它们:

http://msdn.microsoft.com/en-us/library/ez2e4559.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多