日期:2014-05-19  浏览次数:20727 次

StructLayout枚举类的概念不大懂,请指点。
在msdn,上,我看到,它是这样解释的  

StructLayout.Auto  

运行库自动为非托管内存中的对象的成员选择适当的布局。使用此枚举成员定义的对象不能在托管代码的外部公开。尝试这样做将引发异常。    
Q: "使用此枚举成员定义的对象不能在托管代码的外部公开 ",公开是啥个意思啊?

Explicit  

对象的各个成员在非托管内存中的精确位置被显式控制。每个成员必须使用   FieldOffsetAttribute   指示该字段在类型中的位置。  
Q:   “指示该字段在类型中的位置”有啥意义啊?

StructLayout.Sequential  

对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局。这些成员根据在   StructLayoutAttribute.Pack   中指定的封装进行布局,并且可以是不连续的。

Q:“StructLayoutAttribute.Pack   中指定的封装”代表什么啊?

最后一个问题:
控制对象在非内存的位置有啥意义啊?


------解决方案--------------------
StructLayout.Auto  .net自动安排内存布局,.net 中的类实际上都是使用这种布局的。也就说你无法控制类成员的布局,不同于C++。所以在调用非托管代码是不能用这个,否则肯定出错。
Explicit 
你自己强制安排类字段布局,当PInvoke时肯定要用这个,你自己强制指定排列方式,以与C中的结构定义相匹配。
StructLayout.Sequential 就很好理解了吧。


StructLayoutAttribute.Pack实际就是字节对齐方式。C++中有对等的东西。

控制对象在非内存的位置有啥意义啊?
边界对齐,提高访问效率。