首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[StructLayout(LayoutKind.Sequential)]与TypeAttributes.SequentialLayout?

[StructLayout(LayoutKind.Sequential)]与TypeAttributes.SequentialLayout?
EN

Stack Overflow用户
提问于 2018-04-23 08:36:14
回答 1查看 618关注 0票数 1

使用以下方法动态构建P/Invoke的结构

代码语言:javascript
复制
const TypeAttributes typeAttributes = TypeAttributes.Public | 
                                      TypeAttributes.SequentialLayout | 
                                      TypeAttributes.UnicodeClass;
var typeBuilder = moduleBuilder.DefineType("MyType", typeAttributes, typeof(ValueType));

之后,我构造StructLayoutAttribute并将其添加到如下类型

代码语言:javascript
复制
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);

这相当于设置

代码语言:javascript
复制
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

现在,无论我是否将StructLayoutAttribute应用于结构,代码都能很好地工作。

从表面上看,设置属性是一种不可思议的冗余,还是我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 09:07:29

Type.IsLayoutSequential属性的MSDN文档声明如下(重点为我):

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49976680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档