这样一来看起来似乎能使了,但如果使用 Marshal.SizeOf(typeof(IMAGE_OPTIONAL_HEADER)) 看看就会发现,其长度根本就跟 C/C++ 中定义的长度不同。问题还是在于结构中数组,虽然看起来此数组是定义在结构内,但实际上在此结构中只有一个指向 IMAGE_DATA_DIRECTORY[] 数组类型的指针而已,本应保存在 DataDirectory 未知的数组内容,是在托管堆中。 于是问题就变成如何将引用类型的数组,放在一个值类型的结构中。 解决的方法有很多,如通过 StructLayout 显式指定结构的长度来限定内容: 以下内容为程序代码: [StructLayout(LayoutKind.Sequential, Size=XXX)] public struct IMAGE_OPTIONAL_HEADER { public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16; public ushort Magic; public uint NumberOfRvaAndSizes; public IMAGE_DATA_DIRECTORY DataDirectory; } 注意这儿 StructLayout 中 Size 指定的是整个结构的长度,因为 DataDirectory 已经是最后一个字段,故而数组的后 15 个元素被保存在未命名的堆栈空间内。使用的时候稍微麻烦一点,需要一次性读取整个结构,然后通过 unsafe 代码的指针操作来访问 DataDirectory 字段后面的其他数组元素。<页码:[1] [2] [3] [4] [5] [6] [7] [8] 第4页、共8页 |