没有找到asp.net的OpenCV非托管DLL
我们正在构建一个Web应用程序(C#.NET),它使用Emgu opencv包装器forms的非托管库。 我们正在强制构建为32位(x86),我们正在使用32位版本的Emgu。
所有这些在本地构建上都很好用,但是当发布到我们的web服务器时,openCV Dll(s)无法加载:
System.DllNotFoundException Unable to load DLL 'opencv_core240': The specified module could not be found. (Exception from HRESULT: 0x8007007E) System.TypeInitializationException: The type initializer for 'Emgu.CV.CvInvoke' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'opencv_core240': The specified module could not be found. (Exception from HRESULT: 0x8007007E) at Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr prevUserdata) at Emgu.CV.CvInvoke..cctor() --- End of inner exception stack trace --- at Emgu.CV.CvInvoke.cvCreateImageHeader(Size size, IPL_DEPTH depth, Int32 channels) at Emgu.CV.Image`2.AllocateData(Int32 rows, Int32 cols, Int32 numberOfChannels) at Emgu.CV.Image`2.set_Bitmap(Bitmap value) at Emgu.CV.Image`2..ctor(Bitmap bmp)
我尝试了以下在stackoverflow和其他资源上发现的东西:
- 将非托管Opencv Dll放在一个单独的目录中,并将路径放在路径环境变量中,然后重新启动webservice。
- 测试服务器配置是否允许非托管代码执行(是)
- 将非托管Opencv Dll放在system32 \ inetsrv和SysWOW64 \ inetsrv目录中
- 将非托管Opencv Dll放在前面提到的文件夹中的子目录’x86’中
我理解这一点: http : //msdn.microsoft.com/en-us/library/ms366723.aspx
是所有麻烦的原因,但我不明白为什么编辑路径变量以包含包含Dll的正确路径并不能解决任何问题。
关于这个问题的最后一篇有用的post是在2008年,但是还没有提供任何万无一失的解决方案,所以所有的帮助都非常感谢!
确保tbb.dll也在路径中,因为opencv_core240.dll依赖于此。 你可以在opencv / build / common / tbb下找到tbb.dll。
在我的情况下,“npp32_xx_x.dll”(xx_x是版本号,32是32位架构)解决了这个问题。 因此,您可以尝试将此dll放入您的项目输出文件夹中以获取应用程序和Web应用程序中的等效文件夹。 该DLL是Nvidia Cuda NPP图书馆。
从您已经执行的错误描述和检查,您似乎没有安装MSVCRT。
几天前我遇到了同样的问题,我在我的知识中尝试了一切,但没有任何帮助解决问题。 EmguCV在我的本地64位Windows 8 pc但服务器(Windows Web Server 64位)中运行良好。
但是在我做了一些真正随机的事情之后问题得到了修复,如下所示:服务器之前安装了Visual C ++ 2008 Runtime,但是
- 我安装了
Visual C++ 2010 x86
。 - 修复了
Visual C++ 2008 x86 Runtime installation
并解决了这个问题。 我无法解释这是怎么发生的,但我很高兴在两天的随机实验后问题得到了解决。
要解决此问题,请将nvcuda.dll
放在Web服务器上的/bin
文件夹中。 确保nvcuda.dll
必须是x86架构与服务器相同,如果Web服务器具有x64架构 ,则为x64 。
将来在Dependence Walker http://www.dependencywalker.com/
看到其他依赖,并将这个dll与父库一起使用。