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++中有对等的东西。
控制对象在非内存的位置有啥意义啊?
边界对齐,提高访问效率。