我使用动态构建 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
?
看起来,设置属性是不必要的冗余,或者我错过了什么?