Emgu.CV.CvInvoke的类型初始值设定项引发的异常

1 篇文章 0 订阅

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,所以造成这个非常隐蔽的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值