Почему мое приложение не может найти зависимую DLL в том же каталоге? - PullRequest
8 голосов
/ 07 декабря 2010

У меня есть простое консольное тестовое приложение, ConsoleApplication1.exe, которое ссылается на другую сборку clipper.dll.

На 3 машинах, на которых я его тестировал, можно разместить оба файла, например, в. c:\test\ и выполнить ConsoleApplication1.exe.

На другом компьютере, который является клиентским компьютером, запуск ConsoleApplication1.exe приводит к сбою программы и выводу на консоль следующего сообщения:

C:\test>dir
 Volume in drive C has no label.
 Volume Serial Number is 7C46-414F

 Directory of C:\test

07/12/2010  06:08 PM    <DIR>          .
07/12/2010  06:08 PM    <DIR>          ..
07/12/2010  05:13 PM            11,776 ClassLibrary1.dll
07/12/2010  05:13 PM            30,208 ClassLibrary1.pdb
07/12/2010  04:55 PM             3,572 ClassLibrary1.tlb
19/11/2010  02:46 PM           235,008 clipper.dll
19/11/2010  02:46 PM         1,534,976 clipper.pdb
07/12/2010  05:13 PM             6,144 ConsoleApplication1.exe
07/12/2010  05:13 PM            11,776 ConsoleApplication1.pdb
01/08/2010  12:52 PM           139,264 nunit.core.dll
01/08/2010  06:41 AM            57,344 nunit.core.interfaces.dll
01/08/2010  06:41 AM           135,168 nunit.framework.dll
01/08/2010  06:41 AM           547,262 nunit.framework.xml
              11 File(s)      2,712,498 bytes
               2 Dir(s)  477,821,784,064 bytes free

C:\test>ConsoleApplication1.exe

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass
embly 'clipper.dll' or one of its dependencies. The specified module could not b
e found.
   at ConsoleApplication1.Program.Main(String[] args)

Это странно для меня, хотя я не понимаю правила загрузки dll всесторонне, я думал, что он будет искать CWD для указанного файла. И тот факт, что эта же установка работает на других компьютерах, которые я пробовал, тоже странный.

Любопытно, что на рабочем компьютере я удаляю clipper.dll, а затем запускаю его:

C:\Temp>ConsoleApplication1.exe

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass
embly 'clipper, Version=1.0.3975.26584, Culture=neutral, PublicKeyToken=null' or
 one of its dependencies. The system cannot find the file specified.
   at ConsoleApplication1.Program.Main(String[] args)

Необработанное исключение немного отличается, с полным именем сборки.

  • Оба ConsoleApplication1.exe и clipper.dll созданы для .NET 4.
  • На всех машинах установлена ​​среда выполнения .NET 4. На проблемной машине нет .NET SDK
  • clipper.dll представляет собой комбинацию неуправляемого кода C ++ и C ++ / CLI. Это подозрительный характер, потому что это по сути первая C ++ / CLI .NET сборка, которую я создал, и в ней было много неуклюжей работы. Кажется, в отражатель нормально загружается.
  • Эти усилия были предприняты, когда я пытался выяснить, почему я не смог успешно использовать COM-объект (назовите его foo.dll), который также ссылался на clipper.dll - все также на той же проблемной машине. После нескольких часов ада регазма я смог еще больше изолировать его от этого.

Ответы [ 5 ]

13 голосов
/ 07 декабря 2010

или одна из его зависимостей

Развернули ли вы библиотеки времени выполнения CRT на этом компьютере?Обязательно разверните сборку Release вашей сборки.Отладочная версия CRT не распространяется повторно.

1 голос
/ 07 декабря 2010

Обязательно включите библиотеки времени исполнения C ++ ( CRT ) на клиентском компьютере.

1 голос
/ 07 декабря 2010

Я не знаю, почему это произошло с вами, но если вы скопируете dll в каталог system32, это приведет к 2 варианту 1) будет работать 2) Это не сработает, и, таким образом, вы узнаете, что это не относится к пути DLL

0 голосов
/ 07 декабря 2010

Загружены ли файлы ваших приложений из Интернета? Однажды у меня возникла та же проблема, когда моя программа была загружена в zip-файл, а затем распакована на клиентский компьютер. После извлечения я получаю точно такое же сообщение об ошибке "Указанный модуль не может он найден. "

Оказалось, что это политика безопасности Windows для файлов, загружаемых из Интернета. Windows будет «блокировать» загруженные файлы, и их необходимо разблокировать вручную. В моем случае мне нужно было щелкнуть правой кнопкой мыши файл, выбрать свойства, а затем выбрать «разблокировать», и тогда мое приложение смогло загрузить сборку как обычно.

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=mpe&DownloadId=163767

В качестве альтернативы вы можете разблокировать zip-файл перед его извлечением, и тогда все извлеченные файлы также будут разблокированы.

0 голосов
/ 07 декабря 2010

Ну, может быть много причин

Эти усилия были предприняты, когда я пытался выяснить, почему я не смог успешно использовать COM-объект (назовите его foo.dll), который также ссылался на clipper.dll - все также на той же проблемной машине. После нескольких часов ада регазма я смог еще больше изолировать его от этого.

зарегистрирован ли COM-объект (foo.dll) на проблемном компьютере?

Пожалуйста, удалите также pdbs из папки установки.

...