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

bio*_*inc 6 c# interop struct marshalling

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

[StructLayout(LayoutKind.Sequential)]
struct Foo ...
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 5

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

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

  • 这是一个旧答案,但也许值得注意的是它并不完全正确。代码在没有属性的情况下按预期工作的事实是由于 LayoutKind.Sequential 默认应用于所有结构:[MSDN](https://msdn.microsoft.com/en-us/library/system. runtime.interopservices.structlayoutattribute(v=vs.110).aspx#Anchor_7):“C#、Visual Basic 和 C++ 编译器默认将 Sequential 布局值应用于结构。对于类,您必须显式应用 LayoutKind.Sequential 值。 (……)” (2认同)