我何时应该明确指定StructLayout?

我正在摆弄从C#调用DLL,并且需要定义我自己的结构。 很多文章强制结构的顺序布局

[StructLayout(LayoutKind.Sequential)] struct Foo ... 

所以,我按照套件,我的程序工作。 现在,当我把线路拿出来时,它仍然可以工作。 我为什么需要它?

托管结构的内部布局未记录且无法发现。 故意隐藏成员订单和打包等实施细节。 使用[StructLayout]属性,可以强制P / Invoke编组器强制执行特定的布局和打包。

默认恰好匹配您的代码工作所需的只是一个意外。 虽然不是一个不寻常的。 请注意Type.StructLayoutAttribute属性。

有趣的一点。 我确定我的代码失败了,直到我输入一个显式的LayoutKind.Sequential,但是我已经确认Sequential是结构的默认值,即使在1.1中也是如此。

注意VB Reference for Structure意味着在备注>行为>内存消耗中,您需要指定StructLayout来确认内存布局,但StructLayoutAttribute的文档说明Sequential是Microsoft编译器中结构的默认值。

我不完全确定,但它可能会影响二进制序列化 – 它可能会在没有命名或排序信息的情况下按顺序吐出字段(导致文件较小),但这是一个完整的心血来潮。