自定义结构体Marshal报错:对象字段被非对象字段对齐/重叠
问题分析与解决方案
错误原因
你遇到的报错核心问题有两个:
- 使用
FieldOffset显式指定字段偏移时,未给结构体添加[StructLayout(LayoutKind.Explicit)]特性——默认的Sequential布局不允许手动指定字段偏移,强行使用会触发内存对齐/重叠检查错误。 - 结构体中的引用类型字段(比如
byte[])必须按指针大小对齐(32位进程为4字节,64位进程为8字节),你的代码中data字段偏移4在32位下符合要求,但如果是64位进程需调整为8的倍数,不过当前报错优先指向布局特性缺失的问题。
修正后的代码
[StructLayout(LayoutKind.Explicit)] public struct Buf_t { [FieldOffset(0)] public ushort eventType; [FieldOffset(4)] // 32位进程符合指针对齐,64位进程需改为8 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1932)] public byte[] data; [FieldOffset(4 + 1932)] // 用偏移+数组长度推导,避免手动计算错误 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] heap; }
额外说明
- 若运行在64位进程中,需将
data的FieldOffset改为8,heap的偏移改为8 + 1932,确保引用类型字段按8字节对齐。 - 手动计算偏移易出错,建议用“前字段偏移+字段长度”的方式推导后续字段偏移,避免重叠或对齐错误。
内容的提问来源于stack exchange,提问作者HockChai Lim
相关产品推荐
相关产品推荐

