Как проверить зависимость от DLL? - PullRequest
138 голосов
/ 11 сентября 2011

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

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

Ответы [ 13 ]

173 голосов
/ 03 февраля 2015

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

dumpbin /dependents your_dll_file.dll
82 голосов
/ 11 сентября 2011

Попробуйте обходчик зависимостей: http://www.dependencywalker.com/

38 голосов
/ 08 октября 2015

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

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

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

$ ldd your_dll_file.dll

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

14 голосов
/ 10 ноября 2018
  1. Нажмите кнопку запуска, введите «dev».Запустите программу под названием «Командная строка разработчика для VS 2017»

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

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

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

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

enter image description here

9 голосов
/ 11 сентября 2011
  1. Существует программа под названием "Зависит"
  2. Если у вас установлен Cygwin, нет ничего проще, чем ldd file.exe
8 голосов
/ 11 сентября 2011

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

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

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

6 голосов
/ 09 июля 2015

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

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

2 голосов
/ 08 июля 2015

В прошлом (например, дни WinXP), я привык зависеть / зависеть от DLL Dependency Walker (depen.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)

1 голос
/ 12 июня 2017

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 голос
/ 14 августа 2015

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

http://www.ndepend.com/

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

...