使用Marshal.PtrToStructure处理非标准对齐结构体的问题
问题解答
默认情况下,Marshal.PtrToStructure无法正确处理这种按8字节对齐的结构体——因为.NET平台默认的结构体封送对齐规则,和你提到的8字节对齐逻辑不匹配。
要正确封送这类结构体,你需要在C#的对应结构体定义中,通过StructLayout特性显式指定对齐规则,和原生C结构体的对齐方式保持一致:
[StructLayout(LayoutKind.Sequential, Pack = 8)] struct SomeStruct { public int field1; public int field2; }
关键说明:
LayoutKind.Sequential确保结构体字段按定义顺序在内存中排列,和C结构体的字段顺序完全一致;Pack = 8指定结构体的对齐打包值为8字节,完美匹配原生结构体的8字节对齐规则;- C#中的
int类型对应C的int32_t,字段类型的精准匹配是内存解析正确的基础。
定义好上述结构体后,再调用Marshal.PtrToStructure就能正确将内存指针转换为C#结构体实例。
内容的提问来源于stack exchange,提问作者Shanoa Ice
相关产品推荐
相关产品推荐

