为了账号安全,请及时绑定邮箱和手机立即绑定

[StructLayout(LayoutKind.Sequential)]

[StructLayout(LayoutKind.Sequential)]

C#
精慕HU 2021-04-29 10:13:06
我使用以下方法动态构建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)]现在,无论我是否将struct应用于该结构,代码都可以正常工作StructLayoutAttribute。设置显式属性和使用TypeAttribute.SequentialLayout标志之间到底有什么区别?看来,设置属性是不必要的冗余,还是我错过了一些东西?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2021-05-08
  • 1 回答
  • 0 关注
  • 409 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信