• BadImageFormatException异常处理


    BadImageFormatException 是托管代码里面的一个dll载入异常。这种异常可调试性差,问题跟踪难。

    平台:本文中的平台不是指操作系统或者语言框架,主要是指处理器运行环境(32位或者64位)。

    我在项目中混合编程比较多(C#/C++),经常遇到此类问题,所以总结一下,记录下来,供参考。

    场景 1,x64和x86问题。

    64位代码尝试载入32位代码(或者反过来)时会抛此类异常。

    解决方法就是抛异常的dll的编译平台是否和引用它的那个程序平台是否一致。

    场景2,还是X64,x86的问题。

    1.dll载入2.dll失败,两者都是32位或者64位,可是就是说2.dll 载入失败。

    问题可能原因,2.dll依赖了一个不同平台(64位/32位)的dll,导致失败。

    解决办法:检查2.dll的依赖,如果有对不同平台的dll的依赖,用相同平台的版本替换。

    上面两种场景最常见于64位系统下。肯定有人在32位下面也遇到过BadImageFormatException异常,对于这种情况,我见得最多的是下面的场景。

     

    场景3,release版load失败。

    程序在debug模式下跑得好好的,到了release模式下就容易出错,特别是在干净的机器上跑的时候。

    这种情况一般发生在托管代码引用了私有非托管代码dll的时候。很多非托管代码用debug模式编译出来,然后形成了对debug版本的vcrt的dlls的依赖,在干净的机器上一般只有redistributable packages,不带debug版本的vcrt dlls,所以会导致dll载入失败异常。

    解决办法:

    编译一套完整干净的release版的非托管代码dll,替换debug版的。

    或者在干净的机器上安装visual studio。一般不建议这么做。

    PS:

    vs有个自带工具dumpbin可以检查native dll的依赖。很多hack工具也可以直接查看dependency tree.

  • 相关阅读:
    设计模式之Command
    UniversalApp
    swift做服务器端开发
    你不知道的函数floor pow round
    swift开发笔记31
    考试路线
    chrome google mozilla firefox bookmarks import export
    Astah Professional安装
    android studio 安装步骤
    vm安装diagram
  • 原文地址:https://www.cnblogs.com/magic-xxj/p/7659903.html
Copyright © 2020-2023  润新知