Emgu.CV.CvInvoke的类型初始值设定项引发的异常
网上查找的方法都是把Emgu的x86和x64的文件拷贝到程序的运行目录,但是不是每一台电脑使用这种方法都有效。
还有一种办法是把x86或者x64的路径加入到环境变量path中,但仍然是没有用。
为了解决这个问题,我决定把源码都下载下来调试。
调试之后有了进展:类型初始值设定项引发的异常是 Emgu.CV.UI.dll封装的信息。在我电脑上并不是真实的准确错误信息。真实的信息是,下图:
这样把错误定位到cvextern.dll中,这个文件是在x86或者x64中,是Emgu.CV.UI.dll反射加载下来的。
接下来是查看源码了:
源码中的方法是加载dll的,在调试过程中发现cvextern.dll 返回的是 IntPtr.Zero ,意思就是记载失败,而这个方法传入的dllname是绝对路径,而不是相对路径,可以排除掉是因为路径的问题。
而LoadLibraryEx是调用系统中C++函数方法,系统的C++函数我是非常陌生,根本不知道怎么调试。好了,问题卡在这里了。不知道路径都是对的,但dll总是加载失败,在这个问题上一直卡了很久。我在百度搜索的关键词:1、
Emgu.CV.CvInvoke的类型初始值设定项引发的异常 2、LoadLibraryEx的使用
直到我搜索了一下 “无法加载dll”
https://blog.csdn.net/ecnu18918079120/article/details/78368768
在我电脑执行
其中我发现我电脑缺了两个依赖,于是也在其他同事的正常电脑下,查了一下依赖关系,发现正常的电脑有API那个dll,后来从别的电脑拷贝到我电脑上之后,运行了一下,发现居然可以!!!
总结:我对系统或者C++的依赖认识不深,这次可能是偶然发现了问题点,但也没能搞清真正的原理。个人猜测,应该如他人的博客中所描述:dll隐式调用别的所不知道的DLL,而dll所报的异常不能反映出缺失依赖的dll,所以造成这个非常隐蔽的问题。