使用以下方法动态构建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标志到底有什么区别?从表面上看,设置属性是一种不可思议的冗余,还是我遗漏了什么?
发布于 2018-04-23 09:07:29
Type.IsLayoutSequential属性的MSDN文档声明如下(重点为我):
对于动态类型,可以在创建该类型时指定
TypeAttributes.SequentialLayout。在代码中,将带有LayoutKind.Sequential枚举值的StructLayoutAttribute属性应用于类型,以指定布局是顺序的。
因此,对于您来说,相关的部分是TypeAttributes标志。指定StructLayoutAttribute分别是多余的或无效的。
https://stackoverflow.com/questions/49976680
复制相似问题