我什么时候应该明确指定StructLayout?

时间:2008-12-26 16:25:01

标签: c# interop struct marshalling

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

强制结构的顺序布局
[StructLayout(LayoutKind.Sequential)]
struct Foo ...

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

注意VB Reference for Structure 意思是备注>行为>您需要指定StructLayout以确认内存布局的内存消耗,但StructLayoutAttribute的文档 states Sequential是Microsoft编译器中结构的默认设置。

答案 2 :(得分:0)

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