在项目中需要获取摄像头的实时视频,因为不想安装第三方的安装文件来实现,经过筛选找到了easydarwin中的libEasyPlayer。
我们的项目语言是C#,libEasyPlayer的语言是C++的,在ide调试环境下通过dllimport方法直接调用libEasyPlayer很成功,视频顺利显示。但是在本机直接运行exe居然报错。
网上查资料,解决的办法有:
1、通过管理员身份打开cmd运行netsh winsocket reset命令。
结果:没有用。
2、dll版本的问题
通过vs自带的dumpbin命令查看dll版本,得知现有版本是32位的。
到官网去找了个64位的dll,替代之。
exe运行还是报错,报错信息如下:
不得已找大牛朋友求救,朋友支出编译平台的原因。
于是修改生成的平台为x86,而不是any cpu。
选择的x86,编译运行,直接双击exe运行,一切正常!T_T终于顺利解决了。
总结
为什么在ide下会正常运行,而exe运行报错呢?
一位技术很牛的朋友给出结论是“ide与exe所引用的库文件不一致所引起的!”。
没看懂?很正常,大牛举了个栗子:
在exe可执行文件执行时会引用相应的dll,比如这里的libEasyPlayer.dll可能就引用kernel32.dll、winmm.dll等。
它的引用顺序如下:
1、在执行文件的当前目录查找。
2、在系统目录中查找,这里是system32.
3、在环境变量中设置的目录去查找。
而ide是直接在它自身的debug的目录查找相应的dll,这些dll版本与系统目录中的版本不一致,所以导致ide下运行没问题,而exe直接执行报错。