Мы создаем веб-приложение (C # .NET), которое использует неуправляемые библиотеки в виде оболочки Emgu opencv. Мы заставляем сборку быть 32-битной (x86), и мы используем 32-битную версию Emgu.
Все это хорошо работает в локальных сборках, но при публикации на нашем веб-сервере DLL openCV не загружаются:
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 и перезапустите веб-службу.
- Проверено, допускает ли конфигурация сервера неуправляемое выполнение кода (да)
- Размещение неуправляемых библиотек OpenCV Dll в каталогах system32 \ inetsrv и SysWOW64 \ inetsrv
- Размещение неуправляемых библиотек Opencv Dll в подкаталоге 'x86' в ранее упомянутых папках
Я понимаю это: http://msdn.microsoft.com/en-us/library/ms366723.aspx
является причиной всех проблем, однако я не понимаю, почему редактирование переменной пути для включения правильного пути, содержащего Dll, ничего не решает.
Последний полезный пост об этой проблеме был в 2008 году, однако надежного решения еще не было предложено, поэтому вся помощь приветствуется!