我使用以下方法动态构建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
分别是多余的还是无效的。
- 1 回答
- 0 关注
- 409 浏览
添加回答
举报
0/150
提交
取消