i使用
动态构建一个用于p/indoke的结构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
标志到底有什么区别?
看来,设置属性是无罪的冗余,还是我缺少某些内容?
Type.IsLayoutSequential
属性的MSDN文档表示以下(重点矿山(:
对于动态类型,您可以指定
TypeAttributes.SequentialLayout
创建类型时。在代码中,应用StructLayoutAttribute
具有LayoutKind.Sequential
枚举值的属性 类型,指定布局是顺序的。
因此,对您而言,相关部分是TypeAttributes
标志。指定StructLayoutAttribute
分别是冗余或无效的。