您的位置:首页 > 编程语言 > C语言/C++

处理c#调用c++dll所引起的“找不到指定模块"和BadImageFormatException异常

2016-11-04 16:33 1021 查看
如今的windows应用程序开发,由于.net语言简练,框架功能庞大,已经是桌面程序开发的不二之选,特别是利用c#来开发界面的方便程度比原来c++的mfc提高了不止十万八千里。然而,c++代码编译后运行的速度却又是c#难以比拟的,因此就出现这样的情况,用c#来开发应用界面,用c++来开发底层算法,由c#调用c++
dll 来完成核心功能。最近我一个项目就是这么做的,然而这种模式往往容易出现两种异常,一种是在c#调用c++ dll时,容易出现”找不到指定模块”的异常,解决这个异常后,如果把程序放到没有安装vs的机器上运行,又会出现BadImageFormatException异常(如图):

费了九牛二虎之力才处理了这两个问题,在此把他们可能的解决方法说说,以后大家遇到这样的问题时,或许能少走一些弯路。

大略介绍下项目的基本组成:

BiningAccountGUI.exe 是c#开发的界面,AccountBindingDLL.dll 是用 c++ 开发的底层DLL,  BindingAccountGUI.exe 运行后会调用AccountBindingDLL.dll 导出的功能函数, 但当程序执行时会出现如下异常:

当时非常莫名其妙,明明dll 就跟exe在同一个目录下,为何它会报找不到这个问题呢,经过一段时间的搜索,终于弄明白了,原来我的AccountBindingDLL.dll 还引用了其他dll的内容,如果被引用的dll没有在本地目录的话,那么执行起来就会出现找不到模块的错误,我原来的dll引用了其三个dll,分别是log4cplusUD.dll,mmtools.dll,Sunday.dll,我把这三个dll考到本地目录后,异常就消失了。因此,遇到找不到指定模块这种问题时,先要确定被调用的模块是否还引用了其他模块,必须把被引用的其他模块放置到本地目录,c#才能正常加载dll.

第二个问题就更加诡异了,我把开发好的debug版本的程序放到另一台干净的机器,结果弹出badimageformatexception 异常:

我按照网络上的办法,例如安装vcredist_x86.exe,解决不了,根据网上的办法,将c#的程序生成的目标平台设置为x86,同样不行,搜尽了网络也找不到解决方法。后来慢慢思考,发现在开发机器上,程序能正常运行,在没有安装vs的机器上才出现该异常,那有可能安装了vs就可以解决这个问题了,于是为了验证,我在另一台机器上安装vs,将debug版的程序放上去,一跑,果然没问题,那就确定了是系统环境的问题。

安装了vs与没有安装的系统有和区别呢,主要区别就在于,在安装了vs的机器上,系统的SysWOW64文件夹下,会安装上用于vs程序debug的dll, 如果打开该文件夹,对比安装了vs,和没有安装vs的系统,可以发现,安装了vs的系统,在该路径下会多出很多以d结尾的dll, d就是debug的意思,例如msvcp120d.dll, msvcr120d.dll. 如果将debug版本的程序拷贝到没有安装vs的系统上,运行起来,如果没有相关dll,那么调用c++
debug版的dll的时候,程序及有可能报上面所诉的错误,了解了这一点,我尝试将一些相关dll考到没有安装vs的程序目录下,拷贝的dll主要是以下几个:

从那以后,异常就消失了,在没有安装vs的机器上也能跑debug版的程序了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐