我有这个结构和这个代码:
[StructLayout(LayoutKind.Sequential, Pack = 8)]
private class xvid_image_t
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] stride;
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
// public IntPtr[] plane;
}
public int decore()
{
xvid_image_t myStruct = new xvid_image_t();
myStruct.stride = new int[4]; // can be commented out - same result
GCHandle.Alloc(myStruct, GCHandleType.Pinned);
// ...
}
当我尝试运行它时,我得到一个ArgumentException
说法:
对象包含非原始或非 blittable 数据
读完这个 MSDN 页面后说
以下复杂类型也是 blittable 类型:
blittable 类型的一维数组,例如整数数组。但是,包含可变数组的 blittable 类型本身不是 blittable。
仅包含 blittable 类型的格式化值类型(和类,如果它们被编组为格式化类型)。有关格式化值类型的更多信息,请参阅值类型的默认封送处理。
我不明白我做错了什么。我不仅想使用Marshal
,而且也想理解这一点。
所以我真正想知道的是:
- 为什么?
- 我该如何解决这个问题?
- 您提供的解决方案是否也适用于结构中的注释行?
我正在使用 .Net 4.5,但也需要 .Net 2.0 的解决方案。