问题:
昨天从开发机拷贝exe程序到测试机上测试时,发现程序一运行就报以下错误:未能加载文件或程序集“A.dll”或它的某一个依赖项。找不到指定的模块。
相关知识:
1.应用程序查找依赖的dll时,顺序为先查找程序exe的输出路径,如果没有找到,那么会去C:\Windows\System32文件夹中查找(如果exe为64位应用程序的话),或者去C:\Windows\SysWows64文件夹查找(exe为32位应用程序的话)。
2. 如果A.dll找到了,但是A.dll依赖的B.dll没有找到,也会报上述错误,但这时它有可能只会提示没有找到A.dll。此时我们可以用Visual Studio中的dumpbin.exe工具查找A.dll的依赖项,具体可以参考这篇博文
https://blog.csdn.net/jirryzhang/article/details/53816577
所以上述错误产生的原因可能为:
1.没有在exe指定A.dll所在的目录下找到A.dll(一般来说这个目录就是exe所在的目录)。
2.如果在开发机能正常运行该exe,而测试机却出现上述错误,那么就很有可能是我们把程序直接或间接依赖的某个dll放在了C:\Windows\System32文件夹或者C:\Windows\SysWows64文件夹中,然而的测试机的C盘中的这两个文件夹并没有该dll。
一般来说我们碰到上述问题可以按以下顺序排查错误:
解决方法:
1.如果提示的A.dll未找到,首先我们进入存放exe程序依赖的A.dll的位置(一般来说默认是放在exe同目录下)或者C盘的那两个文件夹,如果找不到A.dll那么就会出现上述错误,此时我们将A.dll放在该目录下查看问题是否解决。
2.如果未出现步骤1的情况或将A.dll放在该目录下仍报该错误。那么可能是A.dll依赖的dll没有放在该目录下,这时我们可以使用Visual Studio中的dumpbin查找A.dll依赖的dll是否放在该目录或者是C盘的那两个文件夹里,如果没有找到的话就从开发机拷贝出相应dll放在A.dll所在的目录里(不建议放在C盘的文件夹里,因为你不能保证其他电脑的C盘都有该dll),再进行测试看问题是否解决。
如何避免上述情况的产生:
平常我们做开发的时候,程序能正常跑通的话,最好去比较干净的,没有开发环境的电脑上自己测试一下…
补充:
当然出现上述情况的可能不止上述我提的原因,例如可能是dll的版本不对(比如32位的exe引用了64位的dll)等等情况…
上述归纳总结由于时间原因没有经过严谨论证,如果有疏忽错误欢迎批评指正。