zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    成佛、远不止渡沧海
    导航栏中各按钮在点击当前按钮变色其他按钮恢复为原有色的实现方法(vue、jq、原生js)
    vue动态绑定src加字符串拼接
    对象中那些不注意的用法
    vue实现实时监听文本框内容的变化(最后一种为原生js)
    table
    toFixed()精度丢失;复选框全选、取消
    vue.js
    vue项目知识点总结
    JVM基础知识总结
  • 原文地址:https://www.cnblogs.com/magic-xxj/p/7659903.html
Copyright © 2011-2022 走看看