StructLayout.Auto与sequ​​ential和Explicit相比有什么意义?

时间:2012-02-08 15:36:52

标签: c# pinvoke

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

4 个答案:

答案 0 :(得分:4)

LayoutKind.Auto只是意味着,“我授予CLR重新排序对应于这些字段的字节的权限”。它决定了如何重新组织字段的内存使用,打包等等。 文档没有指定它将发生的具体更改,可能是因为它是一个与编写结构无关的实现细节。

如果您传递给非托管代码,这总是一件坏事,因为非托管代码希望这些字段按特定顺序排列。他们可能的重新安排肯定会产生意想不到的后果。这就是为什么你不能将LayoutKind.Auto结构体暴露给非托管代码。

答案 1 :(得分:1)

documentation似乎很清楚:

  

运行时会自动选择适当的布局   非托管内存中对象的成员。用这个定义的对象   枚举成员不能在托管代码之外公开。   尝试这样做会产生异常。

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

答案 2 :(得分:1)

MS说here

  

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

答案 3 :(得分:0)