关于 StructLayoutAttribute.Pack 讨论

http://bytes.com/topic/c-sharp/answers/654343-what-does-structlayoutattribute-pack-do

在调用 PrintDlgW Win32 API 时,用到PRINTDLG Structure ,于是利用P/Invoke Interop Assistant version 1.0来自动生成如下:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct tagPDW

{

...
   }

结果调用失败,与http://pinvoke.net/ 上查询的结果如下:(http://www.pinvoke.net/default.aspx/Structures/PRINTDLG.html)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack = 1)]
[System.Runtime.InteropServices.ComVisible(false)]        
public class PRINTDLG
{

....
}

进行对比,结果发现就是因为缺了这个 Pack=1 导致调用失败。

结论:

1- 数据结构的内存布局很重要;

2- 还是pinvoke.net更可靠;

原文地址:https://www.cnblogs.com/smwikipedia/p/1669394.html