处理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版的程序了。
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版的程序了。
相关文章推荐
- 处理c#调用c++dll所引起的“找不到指定模块"和BadImageFormatException异常
- C#调用C++ Build 写的DLL时,有时会出错,错误为无法加载 DLL "XXX.dll": 找不到指定的模块。(异常来自 HRESULT:0xXXXXXX)。。
- C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker
- C#调用动态库,无法加载 DLL"xx.dll": 找不到指定的模块
- C# importC++编译的dll提示“找不到指定的模块”
- C#调用SCL2008 动态库SCL_API_cdecl.dll or SCL_API_Stdcall.dll,提示找不到指定模块
- C#换机器后调用dll失败提示无法加载DLL找不到指定的模块
- c#编写ARP欺骗,无法加载 DLL“wpcap”: 找不到指定的模块。loadlibrary("wpcap.dll")失败-找不到指定的模块
- C#调用C++接口提示找不到指定的模块解决方法,本机正常
- C#开发中提示无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)问题的解决办法
- c#调用dll的错误:找不到指定模块(转)
- C#在XP系统下调用C++ dll时报找不到指定模块
- ASP.NET中引用dll“找不到指定模块"的完美解决办法
- C# 调用lua 报错未能加载文件或程序集“lua51.dll”或它的某一个依赖项。找不到指定的模块。 解决方法
- c#调用C++的DLL找不到入口点
- 无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。" —— 的解决方案
- c#调用C++的DLL找不到入口点
- "无法加载 DLL“oramts.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。" —— 的解决方法
- c#调用C++的DLL找不到入口点
- ASP.NET中引用dll“找不到指定模块"的完美解决办法