Неуправляемые библиотеки OpenCV не найдены asp.net

Мы создаем веб-приложение (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 году, однако надежного решения еще не было предложено, поэтому вся помощь приветствуется!


person Arthur    schedule 07.06.2012    source источник
comment
Зарегистрированы ли DLL на машинах для разработки? т.е. через regsvr32. Настроен ли пул приложений для работы в 32-битном режиме?   -  person Mike Miller    schedule 07.06.2012
comment
DLL не были зарегистрированы на машинах для разработки (так что ситуация аналогична для разработки и веб-сервера), а пул приложений настроен на разрешение 32-битных приложений (IIS7)   -  person Arthur    schedule 07.06.2012
comment
если вы используете Depends на opencv_core240.dll, все ли перечисленные DLL доступны на веб-сервере?   -  person Mike Miller    schedule 07.06.2012
comment
Depends жалуется на то, что не нашел: MSVCP100.dll MSVCR100.dll, однако после установки пакета redist VS2010 (x86) microsoft.com/downloads/en/ - по-прежнему ничего   -  person Arthur    schedule 07.06.2012
comment
К сожалению, нет, мы удалили все ссылки на эту библиотеку и использовали для этого совсем другой подход.   -  person Arthur    schedule 03.07.2012
comment
Какой позор; EMGUCV + OpenCV - отличные пакеты, но они страдают от адского DLL. Почему они не могут предоставить согласованный набор библиотек DLL в одной папке, которые работают вместе?   -  person smirkingman    schedule 19.03.2014


Ответы (5)


Убедитесь, что tbb.dll также находится в пути, так как opencv_core240.dll зависит от этого. Вы можете найти tbb.dll в opencv / build / common / tbb.

person user838914    schedule 26.07.2012
comment
Спасибо, у меня была такая же проблема с OpenCvSharp 2.4 (вместо Emgu и на локальной машине), и это решило проблему для меня. - person Phasma; 25.09.2012

В моем случае "npp32_xx_x.dll" (xx_x - номер версии, 32 - 32-битная архитектура) решил проблему. Таким образом, вы можете попробовать поместить эту dll в свои проекты в папку для приложений win и аналогичную папку в веб-приложениях. DLL - это библиотека Nvidia Cuda NPP.

person Rik    schedule 13.08.2012

Судя по описанию ошибки и уже выполненным проверкам, похоже, что вы не установили MSVCRT.

person Luca Del Tongo    schedule 07.06.2012
comment
Спасибо за ответ, однако я проверил, и MSVCRT установлен на веб-сервере. - person Arthur; 07.06.2012
comment
Создайте папку x86 внутри папки bin и попробуйте скопировать туда DLL opencv, например opencv_core240.dll и другие. Это может исправить ошибку «модуль не найден». - person Luca Del Tongo; 08.06.2012
comment
Должен был упомянуть об этом раньше, но я тоже пробовал это, к сожалению, безуспешно. - person Arthur; 08.06.2012

Я столкнулся с той же проблемой несколько дней назад, я перепробовал все, что знал, но ничего не помогло решить проблему. EmguCV отлично работает на моем локальном 64-битном ПК с Windows 8, но на сервере (64-битный Windows Web Server).

Но проблема была исправлена ​​после того, как я сделал несколько действительно случайных вещей следующим образом: на сервере уже установлена ​​среда выполнения Visual C ++ 2008, но снова

  1. я установил Visual C++ 2010 x86.
  2. Отремонтировано Visual C++ 2008 x86 Runtime installation

и это устранило проблему. Я не могу объяснить, как это произошло, но я счастлив, что проблема была решена после двух дней случайного эксперимента.

person undefined    schedule 08.08.2012

Чтобы решить эту проблему, поместите nvcuda.dll в папку /bin на веб-сервере. Убедитесь, что nvcuda.dll должен быть архитектура x86 такая же, как у сервера, или x64, если веб-сервер имеет архитектуру x64.

В будущем посмотрите другие зависимости в Dependence Walker http://www.dependencywalker.com/ и поместите эту dll вместе с родительскими библиотеками.

person user2529687    schedule 27.06.2013