1

我使用动态构建 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工作。

看起来,设置属性是不必要的冗余,或者我错过了什么?

4

1 回答 1

2

Type.IsLayoutSequential属性的 MSDN 文档说明了以下内容(重点是我的):

对于动态类型,您可以TypeAttributes.SequentialLayout 在创建类型时指定。在代码中,将StructLayoutAttribute 具有枚举值的属性应用于LayoutKind.Sequential类型,以指定布局是顺序的。

因此,对您而言,相关部分是TypeAttributes标志。分别指定StructLayoutAttribute是多余的或无效的。

于 2018-04-23T09:07:29.180 回答