StructLayout.Auto与sequential和Explicit相比意味着什么

本文关键字:意味着 什么 Explicit Auto sequential StructLayout | 更新日期: 2023-09-27 18:23:52

我认为LayoutKind.Sequential和LayoutKind.Explicit很清楚,但C#如何处理LayoutKind.Auto?

StructLayout.Auto与sequential和Explicit相比意味着什么

LayoutKind.Auto的意思是,"我授予CLR重新排序与这些字段对应的字节的权限"。它确切地决定了如何为内存使用、打包等重新组织字段文档中没有具体说明它将进行哪些更改,可能是因为它是一个与如何编写结构无关的实现细节。

如果传递给非托管代码,这总是一件坏事,因为非托管代码要求这些字段按特定顺序排列。他们可能的重新安排必然会产生意想不到的后果。这就是为什么不能将LayoutKind.Auto结构公开给非托管代码的原因。

文档似乎很清楚:

运行时会自动为非托管内存中对象的成员。使用此定义的对象枚举成员不能在托管代码之外公开。尝试这样做会生成异常。

换句话说,布局是动态的,这意味着您的对象不能再在托管代码之外使用。

MS在此处显示

默认情况下,公共语言运行库使用"自动布局"值。到减少与Auto值C#相关联的布局相关问题,Visual Basic和C++编译器指定值的顺序布局类型。

运行时会自动为非托管内存中的对象成员选择适当的布局。