我使用以下方法动态构建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)]
现在,无论我是否将struct应用于该结构,代码都可以正常工作StructLayoutAttribute。
设置显式属性和使用TypeAttribute.SequentialLayout标志之间到底有什么区别?
看来,设置属性是不必要的冗余,还是我错过了一些东西?
UYOU
相关分类