[StructLayout(LayoutKind.Sequential)]和TypeAttributes.SequentialLayout之间的区别?

时间:2018-04-23 08:36:15

标签: c# .net reflection.emit structlayout

我使用

动态构建P / Invoke的结构
const TypeAttributes typeAttributes = TypeAttributes.Public | 
                                      TypeAttributes.SequentialLayout | 
                                      TypeAttributes.UnicodeClass;
var typeBuilder = moduleBuilder.DefineType("MyType", typeAttributes, typeof(ValueType));

之后,我构造eq并将其添加到类似

的类型中
ConstructorInfo structLayoutAttributeConstructorInfo = typeof(StructLayoutAttribute).GetConstructor(new[] { typeof(LayoutKind) });

FieldInfo charSetFieldInfo = typeof(StructLayoutAttribute).GetField(nameof(StructLayoutAttribute.CharSet));
CustomAttributeBuilder attr = new CustomAttributeBuilder(structLayoutAttributeConstructorInfo,
                                                         new object[] { LayoutKind.Sequential },
                                                         new FieldInfo[] { charSetFieldInfo },
                                                         new object[] { CharSet.Unicode });
typeBuilder.SetCustomAttribute(structLayoutAttributeBuilder);

相当于设置

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

现在,无论我是否将StructLayoutAttribute应用于结构,代码都可以完全正常

看起来,设置属性是一种不必要的冗余,还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

Type.IsLayoutSequential属性的MSDN文档声明如下(强调我的):

  

对于动态类型,您可以指定TypeAttributes.SequentialLayout   在创建类型时。 在代码中,应用StructLayoutAttribute   具有LayoutKind.Sequential枚举值的属性   type,指定布局是顺序的。

所以对你而言,相关部分是TypeAttributes标志。分别指定StructLayoutAttribute是多余的或无效的。