我使用
动态构建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
应用于结构,代码都可以完全正常。
StructLayoutAttribute
标志之间有什么区别?看起来,设置属性是一种不必要的冗余,还是我错过了什么?
答案 0 :(得分:2)
Type.IsLayoutSequential
属性的MSDN文档声明如下(强调我的):
对于动态类型,您可以指定
TypeAttributes.SequentialLayout
在创建类型时。 在代码中,应用StructLayoutAttribute
具有LayoutKind.Sequential
枚举值的属性 type,指定布局是顺序的。
所以对你而言,相关部分是TypeAttributes
标志。分别指定StructLayoutAttribute
是多余的或无效的。