C# System.DllNotFoundException 解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)

编写的一个C#工程,其中调用了一个Dll,该Dll使用C++编写。在某台机子上运行正常,使用的是VS2015。换到另一台机子上VS2017,无法运行,遇到了多个问题,逐一说明。

  1. 问题1 :工具集问题

换到另外一台机子上,安装的VS2017,打开工程后,发现错误:
MSB8020:提示。
无法找到 v140 的生成工具(平台工具集 =“v140”)。若要使用 v140 生成工具进行生成,请安装 v140 生成工具。或者,可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决方案目标”。
该问题原因主要为平台工具集(这个貌似只针对Vc++的),VS2015和VS2017的差别,二者使用了不同的工具集,具体的介绍见:vs平台工具集

有两种解决方案:
(1)安装VS2015或者其平台工具集,
(2)可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决方案目标”.如下图所示升级:
C# System.DllNotFoundException 解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)_第1张图片

  1. 问题2:System.DllNotFoundException
    解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)

于是我升级了,编译通过。但是升级后,原来的C#工程调用该Dll时出现了,无法找到的错误,System.DllNotFoundException 解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)。
于是我想是不是我的C#工程没跟着更新啊,(ps:我的C#用的是.Net Framework 4.6.1)于是找啊找,发现VS2015和2017使用的是同一个版本的。应该不是这个问题。
于是,在网上找答案,找到了一个依赖分析工具,可以分析出缺少的DLL,于是找到这个网站下载了该工具,使用后,分析。下载网站:
http://dependencywalker.com/

一开始分析,发现我的c++程序,(调用OpenCV),缺少OPENCV_WORLD341D.DLL。于是首先找OpenCV的引用问题,于是找到了一个比较全的介绍的,在这里:[Opencv学习笔记1:安装opencv和VS2015并进行环境配置].(https://www.cnblogs.com/aiguona/p/9370433.html). 发现自己少了一个Path的bin路径,我的配置的是D:\Tool\opencv\build\x64\vc15\bin.之后再分析,不缺少该文件了,但是还缺少一些其他的文件,有一堆,感觉是很多系统的文件,于是又陷入沉思…

C# System.DllNotFoundException 解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)_第2张图片

  1. 问题3:System.BadImageFormatException异常

反过头来,感觉应该是我之前的C#工程的问题,于是我新建了一个C#工程调用那个该Dll,分别使用了.NetFrameWork和普通的控制台程序,这两个调用后者没反应,前者却报出了问题System.BadImageFormatException。
于是,网上搜索到了这个文章:C# System.BadImageFormatException 解决方法经过一番研究后,感觉问题应该是这个:引用dll文件的系统平台不一致,程序中引用外部dll文件的目标平台的版本x86和x64不一致。
这个在之前的dll调用时看到过,今天算是又看了,于是回过头来看我的Dll程序和我那个C#程序,一看,果然二者不同。Dll是Debug,X64,C#是Debug AnyCpu,于是把后者也换作Debug X64,再次编译跑,问题解决!!!
感觉,AnyCpu的选项不确定,有可能是X86,也可能是X64,必须明确二者一致,调用Dll才没问题!!
更改后的两个见下图,红框的。还有些是AnyCpu的,以后慢慢改吧。
C# System.DllNotFoundException 解决之路无法加载DLL“xxxx”:找不到指定的模块(异常来自HRESULT:0X8007007E)_第3张图片

  1. 总结:

(1)OpenCv的环境配置见说明[Opencv学习笔记1:安装opencv和VS2015并进行环境配置].(https://www.cnblogs.com/aiguona/p/9370433.html)
(2)Dll调用一定注意编译的目标环境,两个Debug,Release,和X86,X64,AnyCpu都是有区别的!!感觉,AnyCpu的选项不确定,有可能是X86,也可能是X64,必须明确二者一致,调用Dll才没问题!!
(3)鉴于以上情况,同一个Solution下的应该一致,都在一个里面运行嘛!

你可能感兴趣的:(C++,C#)