【问题标题】:Difference between [StructLayout(LayoutKind.Sequential)] and TypeAttributes.SequentialLayout?[StructLayout(LayoutKind.Sequential)] 和 TypeAttributes.SequentialLayout 的区别?
【发布时间】:2018-10-03 05:44:36
【问题描述】:

我使用动态构建 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 应用到结构体,代码都正常工作

看起来,设置属性是不必要的冗余,还是我遗漏了什么?

【问题讨论】:

    标签: c# .net reflection.emit structlayout


    【解决方案1】:

    Type.IsLayoutSequential 属性的 MSDN 文档指出以下内容(强调我的):

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

    所以对你来说相关的部分是TypeAttributes 标志。分别指定StructLayoutAttribute 是多余的或无效的。

    【讨论】:

    • 谢谢,正是我的想法。我只是想确保在删除 StructLayoutAttribute 时不会产生不必要的副作用。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2018-01-04
    • 2010-10-24
    • 2012-05-05
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    相关资源
    最近更新 更多