[StructLayout(LayoutKind.Sequential)]

我使用以下方法动态构建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标志之间到底有什么区别?

看来,设置属性是不必要的冗余,还是我错过了一些东西?


精慕HU
浏览 410回答 1
1回答

UYOU

该Type.IsLayoutSequential属性的MSDN文档指出以下内容(强调我的意思):对于动态类型,可以指定TypeAttributes.SequentialLayout 创建类型的时间。在代码中,将StructLayoutAttribute 具有LayoutKind.Sequential枚举值的属性应用于类型,以指定布局是连续的。因此,对您而言,相关部分是TypeAttributes标志。指定StructLayoutAttribute分别是多余的还是无效的。
打开App,查看更多内容
随时随地看视频慕课网APP