6

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

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

因此,我遵循套件,并且我的程序有效。现在,当我把线拿出来时,它仍然有效。为什么我需要它?

4

3 回答 3

5

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

默认值恰好与您使代码工作所需的内容相匹配,这只是一个意外。虽然并不罕见。请注意 Type.StructLayoutAttribute 属性。

于 2008-12-26T16:41:45.893 回答
1

有趣的一点。我确信在我输入显式 LayoutKind.Sequential 之前我的代码会失败,但是我已经确认即使在 1.1 中,Sequential 也是结构的默认设置。

请注意,VB Reference for Structure 在 Remarks > Behavior > Memory Consumption 中暗示您确实需要指定 StructLayout 以确认内存布局,但StructLayoutAttribute的文档 状态 Sequential 是 Microsoft 编译器中结构的默认设置。

于 2010-03-17T04:43:20.633 回答
0

我不完全确定,但它可能会影响二进制序列化 - 它可能会按顺序吐出字段而没有命名或排序信息(导致文件更小),但这完全是一时兴起。

于 2008-12-27T12:02:58.360 回答