DllNotFoundException
最近在使用Unity调用C++的dll的时候出现了dllNotFoundException的报错,但是我明明在对应的路径放到了相应的dll,在这里总结一下解决错误的几种方法:
一. 检查运行dll是否需要其他的dll
不仅仅是适用于Unity,大多数dll的运行是需要其他dll的支持的,所以有时候会出现在电脑A上能运行该dll,但是换一台电脑就找不到对应的dll的情况,这个时候可以下载对应的工具Dependency Walker,该软件可以用来查找exe和dll需要的关联文件,可以在这里下载https://www.dependencywalker.com/,下载后打开exe,直接在file里打开该dll,然后查看下面显示缺失的dll,找到后补上该dll即可。
具体Dependency Walker的使用方法可以自行百度,这里提一点重要的信息,由于Dependency Walker有很久没有进行更新维护了,所以一些老的dll可能是Windows7这种老系统使用的dll,如果显示API-MS-WIn-Core类似的dll缺失,也属于正常情况,可以不用管它,具体可以忽略的dll格式如下:
API-MS-WIN-.dll
EXT-MS-WIN-.dll
IESHIMS.dll
EMCLIENT.dll
DEVICELOCKHELPERS.dll
如下图所示是正常的:
更多dll信息可以参考:https://ofekshilon.com/2016/03/27/on-api-ms-win-xxxxx-dll-and-other-dependency-walker-glitches/
二. 检查自己的dll对应的平台是不是对的
比如自己用的软件是64位的,那么就要使用对应平台的dll,而且最好是用Release版本的,Debug版本的可能会出问题。
三. 检查自己路径和对应的代码有没有写错
比如在Unity中使用,必须把对应的dll放在Assets目录下的Plugins文件夹下,64位的dll放在Plugins的x64文件夹(文件夹叫x86_64也可以)内,32位的放在x86文件夹内,再比如在C#中写[DllImport("dllName", EntryPoint = "function")]
的时候,dll的名字后面不要加.dll。
具体操作可以参考这里
四. 可能是dll内部本身有问题
比如我实际使用中,先是显示两条Warning,Plugins:Falied to load ' Assets/Plugins/x64/Debug/myDLL.dll' with error' 动态链接库(DLL)初始化例程失败
, 然后报错DLLNotFoundException,这个时候其实不是DLL找不到,而是dll在初始化的时候报错了,Unity这里还是有点坑的,因为一但出问题,它只会报DLLNotFoundException,然后我从Unity这边调试我的dll,果然发现是static成员的构造过程中出现了错误,具体从Unity调试C++dll的方法可以参考这里
如果以上办法都不能解决,可以参考以下链接:这里