[structlayout(layoutkind.sequential)]]和typeattributes.sequen



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分别是冗余或无效的。

相关内容

  • 没有找到相关文章

最新更新