br> 这种方法的优点是定义简单,但使用时需要依赖 unsafe 的指针操作代码,且受到数组字段必须是在最后的限制。当然也可以通过 LayoutKind.Explicit 显式指定每个字段的未知来模拟多个结构内嵌数组,但这需要手工计算每个字段偏移,比较麻烦。 另外一种解决方法是通过 Marshal 的支持,显式定义数组元素所占位置,如 以下内容为程序代码: [StructLayout(LayoutKind.Sequential, Pack=1)] public struct IMAGE_OPTIONAL_HEADER { public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16; public ushort Magic; public uint NumberOfRvaAndSizes; [MarshalAs(UnmanagedType.ByValArray, SizeConst=IMAGE_NUMBEROF_DIRECTORY_ENTRIES)] public IMAGE_DATA_DIRECTORY[] DataDirectory; } 这种方法相对来说要优雅一些,通过 Marshal 机制支持的属性来定义值数组语义,使用起来与普通的数组区别不算太大。上述数组定义被编译成 IL 定义: 以下内容为程序代码: .field public marshal( fixed array [16]) valuetype IMAGE_DATA_DIRECTORY[] DataDirectory
页码:[1] [2] [3] [4] [5] [6] [7] [8] 第5页、共8页 |