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.