未找到asp.net的OpenCV非托管DLL

时间:2012-06-07 11:09:21

标签: c# asp.net opencv unmanaged emgucv

我们正在构建一个Web应用程序(C#.NET),它使用Emgu opencv包装器形式的非托管库。我们正在强制构建为32位(x86),我们正在使用32位版本的Emgu。

所有这些在本地构建上都很好用,但是当发布到我们的web服务器时,openCV Dll无法加载:

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放在一个单独的目录中并放入 路径环境变量中此目录的路径,然后重新启动 网络服务。
  • 测试服务器配置是否允许非托管代码 执行(是)
  • 将非托管Opencv Dll放在system32 \ inetsrv和 SysWOW64 \ inetsrv目录
  • 将非托管Opencv Dll放在子目录'x86'中 之前提到的文件夹

我明白这一点: http://msdn.microsoft.com/en-us/library/ms366723.aspx

是所有麻烦的原因,但是我不明白为什么编辑路径变量以包含包含Dll的正确路径并不能解决任何问题。

关于这个问题的最后一篇有用的帖子是在2008年,但是还没有提供任何万无一失的解决方案,所以所有的帮助都非常感谢!

5 个答案:

答案 0 :(得分:2)

确保tbb.dll也在路径中,因为opencv_core240.dll依赖于此。你可以在opencv / build / common / tbb下找到tbb.dll。

答案 1 :(得分:1)

在我的情况下,“npp32_xx_x.dll”(xx_x是版本号,32是32位架构)解决了这个问题。 因此,您可以尝试将此dll放入您的项目输出文件夹中以获取应用程序和Web应用程序中的等效文件夹。 该DLL是Nvidia Cuda NPP图书馆。

答案 2 :(得分:0)

根据您已经执行的错误说明和检查,您似乎还没有安装MSVCRT。

答案 3 :(得分:0)

几天前我遇到了同样的问题,我在我的知识中尝试了一切,但没有任何帮助解决问题。 EmguCV在我的本地64位Windows 8 pc但服务器(Windows Web Server 64位)中运行良好。

但问题是在我做了一些真正随机的事情之后修复了如下: 服务器先前安装了Visual C ++ 2008 Runtime,但是再次

  1. 我安装了Visual C++ 2010 x86
  2. 已修复 Visual C++ 2008 x86 Runtime installation
  3. 并解决了这个问题。我无法解释这是怎么发生的,但我很高兴在经过两天的随机实验后问题得到了解决。

答案 4 :(得分:0)

要解决此问题,请将nvcuda.dll放在Web服务器上的/bin文件夹中。请确保nvcuda.dll必须 x86架构与服务器相同,或者如果Web服务器具有 x64架构,则为x64。

将来在Dependence Walker http://www.dependencywalker.com/中看到其他依赖,并将这个dll与父库一起使用。