如何将Object数组传递给非托管代码?

时间:2010-07-09 17:49:40

标签: c# c++ arrays marshalling unmanaged

我正在尝试将一组对象从C#传递给非托管C ++,似乎没有任何工作。

编译器不会让我假装数组是IntPtr。将数组转换为IntPtr不起作用。我试图传递固定数据的地址,但这也不起作用。

我只需要将一个指针传递给数组的开头,这就太难了。

有任何建议或链接吗?感谢名单!

3 个答案:

答案 0 :(得分:1)

你能投射到无效指针吗?确保固定了对象数组。

答案 1 :(得分:1)

最终有效:

  1. 传递一个结构数组而不是一个对象数组(引用)。
  2. 在结构定义之前放置“[StructLayout(LayoutKind.Sequential,Pack = 1)]”。
  3. 在字符串之前(在结构定义中)放置“[MarshalAs(UnmanagedType.LPWStr)]”,使字符串在C ++端显示为宽字符串。
  4. 在DllImport声明中声明参数的结构数组:“VariableObject [] varObj”。
  5. 将指向类的指针声明为C ++端的参数。 (C ++类镜像C#结构。):“VariableObject * varObj”。

答案 2 :(得分:0)

在C#/ Managed方法签名中,使用 [MarshalAs(UnmanagedType.LPArray,SizeParamIndex = 0)] 标记输入参数...

[DllImport(...)]
public void DoTask
    (
        ...,
        [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] int[] results,
        ...
    );

然后像往常一样调用它。此外,在非托管代码中,您可以修改此数组。我建议您发送一个额外的int告诉非托管代码数组的大小是什么,以防止“数组越界”修改。