it-swarm.com.ru

Как проверить зависимость DLL?

Иногда, когда я делаю небольшой проект, я не достаточно осторожен и случайно добавляю зависимость для DLL, о которой я не знаю. Когда я отправляю эту программу другу или другим людям, "она не работает", потому что отсутствует "какая-то DLL". Это, конечно, потому что программа может найти DLL в моей системе, но не в их.

Есть ли способ проверить исполняемый файл на наличие DLL зависимостей или выполнить программу в "чистой" среде без DLL для тестирования, чтобы предотвратить такие ситуации упс?

133
orlp

Попробуйте пройтись по зависимостям: http://www.dependencywalker.com/

81
Luchian Grigore

dumpbin из инструментов Visual Studio (папка VC\bin) может помочь здесь:

dumpbin /dependents your_dll_file.dll
168
JeffRSon

Я могу порекомендовать интересное решение для поклонников Linux. После изучения этого решения я переключился с DependencyWalker на этот.

Вы можете использовать свой любимый ldd поверх связанных с Windows exe, dll.

Для этого вам необходимо установить Cygwin (базовая установка, без дополнительных пакетов) в Windows, а затем просто запустить Cygwin Terminal. Теперь вы можете запускать ваши любимые команды Linux, в том числе:

$ ldd your_dll_file.dll

UPD: Вы можете использовать ldd также через терминал git bash в Windows . Нет необходимости устанавливать cygwin в случае, если у вас уже установлен git.

36
troyane
  1. Нажмите кнопку запуска, введите "dev". Запустите программу под названием "Командная строка разработчика для VS 2017"

  2. Определите полный путь к файлу сборки, с которой вы пытаетесь работать

  3. В открывшемся окне введите dumpbin /dependents [path], где [path] - это путь, который вы выяснили на шаге 2

  4. нажмите клавишу ввода

Бэм, у тебя есть информация о зависимости. Окно должно выглядеть так:

enter image description here

10
Iamsodarncool
  1. Есть программа под названием "Зависит"
  2. Если у вас установлен Cygwin, ничего проще, чем ldd file.exe
9
Artyom

Самое безопасное - иметь чистую виртуальную машину, на которой вы можете протестировать свою программу. На каждой версии, которую вы хотите протестировать, восстановите VM к его первоначальному чистому значению. Затем установите вашу программу, используя ее настройки, и посмотрите, работает ли она.

У Dll проблем разные лица. Если вы используете Visual Studio и динамически связываетесь с CRT, вы должны распространять библиотеки DLL CRT. Обновите ваш VS, и вам придется распространять другую версию CRT. Недостаточно просто проверить зависимости, так как вы можете их пропустить. Выполнение полной установки на чистой машине - единственное безопасное решение, IMO.

Если вы не хотите настраивать полнофункциональную среду тестирования и использовать Windows 7, вы можете использовать XP-Mode в качестве начальной чистой машины и XP-More для дублирования виртуальной машины.

8
eran

На компьютере разработчика вы можете запустить программу и запустить Sysinternals Process Explorer . В нижней панели он покажет вам загруженные библиотеки DLL и текущие пути к ним, что удобно по ряду причин. Если вы выполняете пакет развертывания, он покажет, какие библиотеки DLL указаны по неправильному пути (т.е. не были упакованы правильно).

В настоящее время наша компания использует проекты установщика Visual Studio для обхода дерева зависимостей и вывода в виде свободных файлов программы. В VS2013 теперь это расширение: https://visualstudiogallery.msdn.Microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Затем мы упаковываем эти свободные файлы в более полный установщик, но, по крайней мере, эта программа установки проецирует все зависимости dot net и помещает их в одну точку и предупреждает вас, когда чего-то не хватает.

6
Shiv

Раньше (например, дни WinXP) я привык зависеть от DLL иждивенцев зависимости (зависимость.exe), но бывают случаи, когда я все еще не могу определить DLL проблемы). В идеале, мы хотели бы выяснить это до проверки во время выполнения, но если это не решает проблему (или занимает слишком много времени), вы можете попробовать включить "оснастку загрузчика", как описано в http: // blogs. msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx и https://msdn.Microsoft.com/en-us/library/windows/hardware /ff556886(v=vs.85).aspx и кратко упомянуто Ошибка LoadLibrary; GetLastError не помогает

ВНИМАНИЕ: Я в прошлом испортил свои Windows, дурачась с gflag, заставляя его ползти на колени, вы были предупреждены.

enter image description here

Примечание. "Привязка к загрузчику" относится к каждому процессу, поэтому включение пользовательского интерфейса не будет проверяться (используйте cdb или glfags -i).

2
HidekiAI

Пожалуйста, поищите в файле google.exe, это небольшая утилита для этого.

1
shiying yu

NDepend уже упоминался Джесси (если вы анализируете код .NET), но давайте объясним, как именно он может помочь.

Существует ли программа/сценарий, который может проверять исполняемый файл на наличие DLL зависимостей или выполнять программу в "чистой" среде, свободной от DLL, для тестирования, чтобы предотвратить возникновение таких проблем?

На панели "Свойства проекта NDepend" вы можете определить, какие сборки приложения нужно анализировать (выделено зеленым цветом) и . NDepend будет выводить сборки сторонних производителей, используемые приложениями (в синем). Предоставляется список каталогов, в которых можно искать приложения и сторонние сборки.

NDepend Project Properties Application and Third-Party assemblies

Если сторонняя сборка не найдена в этих каталогах, она будет в режиме ошибки. Например, если я удаляю каталог .NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319, я вижу, что сторонние сборки .NET Fx не разрешаются:

NDepend Project Properties Application and Third-Party assemblies not resolved

Отказ от ответственности: я работаю на NDepend

1
Patrick from NDepend team

Если у вас есть исходный код, вы можете использовать ndepend.

http://www.ndepend.com/

Это дорого и делает гораздо больше, чем анализ зависимостей, так что это может быть излишним для того, что вы ищете.

1
Jesse