相关文章  
  • 浅谈如何利用BartPE创建PE工具盘
  • Windows Mobile 2003 Second Edition 中 ActiveSync 编程模型的增强功能
  • 在完成所有绑定后仍然有许多要进行的操作
  • 在你的企业中管理Windows和应用程序
  • 动态加载用户控件的组件
  • 小心GDI+资源泄漏 -- 猜想 测试 应对全过程
  • 浅谈 C# 中的代码协同 (Coroutine) 执行支持
  • Internet Explorer 中编辑 OLE 嵌入文档
  • 教你通过 Emit 实现动态生成一个类
  • 如何才能在10046event自由漫步
  •   推荐  
      科普之友首页   专利     科普      动物      植物        天文   考古   前沿科技
     您现在的位置在:  首页 >>文献 >>培训

    在 C# 中处理结构内的数组源代码分析4


      这样一来看起来似乎能使了,但如果使用 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页

         

          设为首页       |       加入收藏       |       广告服务       |       友情链接       |       版权申明      

    Copyriht 2007 - 2008 ©  科普之友 All right reserved