Если DLL не найдена во время P/Invoking, как я могу получить сообщение об отсутствующей конкретной неуправляемой DLL?

Когда вы ссылаетесь на неуправляемую библиотеку (скажем, «A.dll»), которая, в свою очередь, ссылается на другую библиотеку («B.dll»), а B.dll отсутствует, вы получите сообщение об ошибке во время выполнения о невозможности загрузки. 'B.dll'.

Но когда вы P/Invoke в «A.dll» из управляемого кода, вы получите общее исключение в этой форме:

Необработанное исключение: System.DllNotFoundException: невозможно загрузить DLL «A.dll»: указанный модуль не найден.

Как я могу получить сообщение об ошибке, указывающее конкретный неуправляемый DLL-файл, который не удалось загрузить при p/вызове из управляемого кода?


person Community    schedule 06.11.2008    source источник
comment
Интересно, поможет ли в этой ситуации Process Monitor от sysinternals? Возможно, это укажет на отсутствующую DLL.   -  person rturrado    schedule 17.06.2011
comment
Боже, вы не можете ожидать, что компьютер сообразит что-то подобное, когда программист может потратить полчаса, делая это вручную, и в любом случае, это никогда не произойдет с развернутым программным обеспечением. Правильно? Это кажется странным, но не задумывались ли вы иногда, действительно ли ребята из Microsoft понимают, для чего нужны компьютеры?   -  person Spike0xff    schedule 31.08.2011


Ответы (4)


Я не думаю, что есть какой-то конкретный API, который вы можете использовать, чтобы точно определить, почему LoadLibrary (базовый Win32 API) не удалось выполнить "A.dll". Я рекомендую использовать такой инструмент, как Dependency Walker, для устранения ошибок загрузки DLL.

person Bradley Grainger    schedule 06.11.2008

Я не уверен, как вы можете получить это в виде исключения. Когда я сталкиваюсь с этой проблемой, я обычно пытаюсь открыть DLL с помощью файла depend.exe. Это довольно хорошо и сообщает об отсутствующих зависимостях, которые существуют, если DLL просто загружается из своего текущего местоположения.

person JaredPar    schedule 06.11.2008

Получить ответ из исключения не получится, но можно (с большим трудом) через Process Monitor. В этой статье обсуждается, как это сделать, а также содержится инструмент для сканирования журналов Process Monitor для поиска конкретной проблемы.

http://tech.blinemedical.com/debug-could-not-load-file-or-assembly-or-one-of-its-dependencies/

person Samuel Neff    schedule 18.03.2013

Fusion Log Viewer — хороший инструмент для отладки проблем с загрузкой сборок в приложениях .NET.

Для выявления общих проблем с загрузкой файлов вы можете использовать Process Monitor.

person Tyler Durden    schedule 18.12.2013