我们正在构建一个 Web 应用程序 (C# .NET),它使用 Emgu opencv 包装器形式的非托管库。我们强制构建为 32 位 (x86),并且我们使用的是 32 位版本的 Emgu。
所有这些在本地构建上都很好,但是当发布到我们的网络服务器时,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 放在一个单独的目录中,并将该目录的路径放在 path 环境变量中,然后重新启动 web 服务。
- 测试服务器配置是否允许非托管代码执行(是)
- 将非托管 Opencv Dll 放在 system32\inetsrv 和 SysWOW64\inetsrv 目录中
- 将非托管 Opencv Dll 放在前面提到的文件夹中的子目录“x86”中
我明白这一点:http: //msdn.microsoft.com/en-us/library/ms366723.aspx
是所有麻烦的原因,但是我不明白为什么编辑路径变量以包含包含 Dll 的正确路径并不能解决任何问题。
关于这个问题的最后一篇有用的帖子是在 2008 年,但是还没有提供万无一失的解决方案,因此非常感谢所有帮助!