System.DllNotFoundException в. NET Базовое приложение - PullRequest
1 голос
/ 19 марта 2020

В базовом приложении. NET я получаю эту ошибку при попытке запустить проект модульного теста:

System.DllNotFoundException: Unable to load DLL 'opencv_core246' or one of its dependencies: The specified module could not be found. (0x8007007E)

В строке DLLImport просто используется 'opencv_core246 '(без пути), поэтому я понимаю, что среда выполнения должна выглядеть в том же каталоге, что и сам исполняемый файл (или при сбое этой Windows / System32 или Windows / SystemWOW64). Это теперь во всех трех местах, черт побери, но все еще нет игры в кости. У моего коллеги такая же настройка (у меня виртуальная машина Windows, работающая в Parallels на Ma c, тогда как у него нативная Windows, но это не имеет значения), и его тесты выполняются нормально. Любые идеи о том, как отладить этот, приветствуются.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Прежде всего, пожалуйста, не распыляйте DLL-файлы по всей вашей системе. Это просто усложняет жизнь. Удалите библиотеки DLL из системных каталогов и больше никогда не изменяйте эти каталоги. Они принадлежат системе, а не вам.

Теперь вы получите DllNotFoundException, если DLL не найдена или одна из ее зависимостей не найдена. DLL будет найдена, так как она находится рядом с исполняемым файлом. Er go, одна из зависимостей не может быть найдена. Узнайте, каковы зависимости, и убедитесь, что они могут быть разрешены.

0 голосов
/ 20 марта 2020

Я добавляю свой собственный ответ на случай, если он будет полезен кому-то еще. Как указывает принятый ответ, мне действительно не хватало зависимостей от родной dll (opencv_core246). Дело в том, как узнать, что это за зависимости. Я использовал утилиту, называемую Walker зависимостей, но это дало довольно запутанные результаты - казалось, это указывало на то, что мне не хватало ядра windows! Проблема прояснилась с помощью утилиты dumpbin, которая поставляется с компилятором Microsoft C ++. Вы можете использовать это следующим образом:

dumpbin /DEPENDENTS <my.dll>

Это указывало на то, что у моей dll было три зависимости: ядро ​​и две, которые являются частью C ++ Redist-пакета, который не был установлен в моей системе. , Установка, которая исправила отсутствующую проблему с зависимостями.

РЕДАКТИРОВАТЬ: На самом деле результаты обходчика зависимостей копаются глубже в дереве зависимостей, чем свалка, поэтому вы можете использовать его для получения тех же результатов. Зависимости dll находятся на верхнем уровне дерева результатов.

...