【发布时间】:2018-10-03 05:44:36
【问题描述】:
我使用动态构建 P/Invoke 结构
const TypeAttributes typeAttributes = TypeAttributes.Public |
TypeAttributes.SequentialLayout |
TypeAttributes.UnicodeClass;
var typeBuilder = moduleBuilder.DefineType("MyType", typeAttributes, typeof(ValueType));
之后,我构造 StructLayoutAttribute 并将其添加到这样的类型中
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 应用到结构体,代码都正常工作。
- 设置显式属性和使用
TypeAttribute.SequentialLayout标志之间到底有什么区别?
看起来,设置属性是不必要的冗余,还是我遗漏了什么?
【问题讨论】:
标签: c# .net reflection.emit structlayout