将具有固定大小数组的C++结构体转换为C#的Marshaling

5

我有一个C#结构体声明如下:

public struct AdvertisementData {
    public byte SomeId;
    [MarshalAs(UnmanagedType.LPArray , SizeConst = 12)]
    public byte[] AnArray;
  }

以下是其C++版本:

struct AdvertisementData {
  uint8_t SomeId;
  uint8_t AnArray[12];
};

当我试图将上述结构体在C++中栈分配的实例的引用发送到C#时,我收到以下错误信息:“无法将类型为Byte []的结构字段作为LPArray编组。” 您有什么想法是我做错了什么?

你能尝试使用“SafeArray”吗? - Daniel A. White
1个回答

8

尝试将它作为ByValArray进行编组:

 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
  public byte[] AnArray;

还有,你确定你的结构体不需要设置任何LayoutKind吗?


单体Interop文档称结构体默认为按顺序排列布局,这就是我认为我应该没问题的原因。http://www.mono-project.com/Interop_with_Native_Libraries - SaldaVonSchwartz
好的,明白了。那你尝试过按值传递进行编组吗? - Eugene Podskal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接