【问题标题】:Marshalling dynamic size array into struct将动态大小数组编组到结构中
【发布时间】:2014-04-02 12:36:23
【问题描述】:

如何定义具有动态大小数组的结构?

对吗?

struct MyStruc { 

    public int len; 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)]
    public int buf[]; 
}

【问题讨论】:

  • 什么是“动态大小的数组”?像List<int>这样的数组?
  • 您必须将其设为 IntPtr 或转到 unsafe(后者可能更容易让事情正常运行)。
  • 我不能使用 List,因为在 c++ 中的大小定义如 int*
  • 它不是动态调整大小的,在 32 位模式下它只占用 8 个字节。您肯定是指 UnmanagedType.ByValArray 吗?这是 C 代码中的常见技巧。
  • 不,ByValArray 用于在编译时知道大小的内联数组。

标签: c# struct pinvoke marshalling


【解决方案1】:

假设您想要一个包含指向数组的指针的结构。

将指向数组的指针声明为IntPtr,并使用Marshal.AllocHGlobal、Marshal.Copy 等手动编组数组内容。

假设您想要一个可变大小的结构,而不是包含指向数组的指针的结构。

您不能使用 p/invoke 编组可变大小的结构。您至少有以下两种选择:

  1. 将结构分成两个参数。
  2. 使用Marshal.AllocHGlobal、Marshal.Copy 等手动编组结构。

【讨论】:

  • 好吧,我明白了,但我不想在 c# 中使用 IntPtr :( 但我想,我没有其他办法。
  • 我的两个假设中哪一个是正确的。显示该类型的 C++ 声明会有所帮助。
  • 实际上,我使用的是 dll,但我没有 dll 代码。但我有 dll 对 struct 的定义。定义如下: struct MyStruc { int len;整数缓冲区[1]; }
  • 但是当我和开发这个dll的开发者交谈时,他对我说这个buf没有固定大小,它可以是动态的。
  • 我猜,dll端是用指针buff并返回一个数组。
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 2014-12-09
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2011-08-19
  • 2021-11-15
相关资源
最近更新 更多