• 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.

  • 相关阅读:
    BZOJ-1034: [ZJOI2008]泡泡堂BNB (田忌赛马贪心)
    BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)
    BZOJ-1864: [Zjoi2006]三色二叉树 (julao都说简单的树形DP)
    BZOJ-2657: [Zjoi2012]旅游(journey) (树形DP求最长链)
    BZOJ-2241: [SDOI2011]打地鼠 (模拟+枚举)
    BZOJ-1207: [HNOI2004]打鼹鼠 (LIS类似DP)
    BZOJ-1821: [JSOI2010]Group 部落划分 Group (二分+并查集)
    BZOJ-1218: [HNOI2003]激光炸弹 (前缀和+模拟)
    [SinGuLaRiTy] ZKW线段树
    [SinGuLaRiTy] 字节大小
  • 原文地址:https://www.cnblogs.com/magic-xxj/p/7659903.html
Copyright © 2020-2023  润新知