Як перевірити наявність DLL?


165

Іноді, коли я роблю невеликий проект, я недостатньо обережний і випадково додаю залежність від DLL, про яку я не знаю. Коли я надсилаю цю програму другові чи іншим людям, "вона не працює", оскільки "деякі DLL" відсутні. Це, звичайно, тому, що програма може знайти DLL в моїй системі, але не в їхній.

Чи є спосіб сканування виконуваного файлу для DLL залежностей або виконати програму в «чистої» DLL вільного середовища для тестування , щоб запобігти цьому Упс ситуацію?


2
Налагоджувач показує всі DLL, які завантажуються у вікні виводу. Налагодження + Модулі Windows + відображає їх перелік. Будьте впевнені, що ви можете рахувати за них усі. І протестуйте інсталятора так, як ви тестуєте код, використовуйте VM.
Ганс Пасант

@Hans Passant: Чи можу я знайти повний список стандартних DLL-файлів Windows?
orlp

Так, в c: \ windows \ system32 з авторським правом Microsoft.
Ганс Пасант

2
@orlp - Ви також можете спробувати dumpbin /dependents <program>. Я здогадуюсь, що список буде більш релевантним, ніж перелік усіх DLL-файлів у %SYSTEM%або %SYSTEM32%. Також дивіться Параметри DUMPBIN на MSDN.
jww

Відповіді:


104

Спробуйте Dependency Walker(останнє оновлення у 2006 р.) Або сучасний перезапис його під назвою Dependencies.


20
Я читав, що це датується, чи є щось більш актуальне?
TankorSmash

6
Якщо можливо, я буду довіряти лише оригінальному постачальнику ОС, оскільки залежність від DDL має бути завданням ОС. Чи може це зробити будь-яка утиліта Майкрософт? Командний рядок для мене добре.
Робін Хсу

3
@RobinHsu: DependencyWalker використовувався для доставки з Visual Studio до Visual Studio 2005. Найновіша збірка входить до комплекту розвитку драйверів Windows (і не доступна на офіційному веб-сайті). Досі офіційно не є інструментом Microsoft, але Microsoft санкціонував, просував та рекламував.
ІІнеочікуване


8
Зараз перезапис з відкритим кодом частково виконано в C #, відповідь " Dependency.exe ": github.com/lucasg/Dependitions . Тестове враження: трохи бета-ish , але він обробляє API-набори та SxS мабуть (відсутній у Dependency Walker).
Stein Åsmul

217

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

dumpbin /dependents your_dll_file.dll

7
Зручний маленький інструмент і економить необхідність установки нічого нового, коли у вас вже встановлений VS.
Джеймс

13
Так, dumpbin.exeдуже корисно розібратися /dependentsі /imports. Ви також можете використовувати його на інших машинах, якщо скопіювати link.exeразом із ним і переконатися, що відповідний перерозподіл часу виконанняmsvcr120.dll версії x86 Visual C ++ ( для Visual Studio 2013) доступний на цільовій машині. Деякі варіанти мають додаткові залежності. - До речі, вони накрутили назву варіанту, це мало бути, /PREREQUISITESа не /DEPENDENTS, вони повинні були вивчити латинську мову.
Лумі

2
Це так чудово, що ми додали це до нашої системи збирання як крок перевірки, коли генерується остаточний виконуваний файл, щоб ми не залежали від того, що не включено до доставки.
Лотар

4
Єдиний недолік цього зручного інструменту дуже прихований: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Якщо ви відкриєте командний рядок Visual Studio (Інструменти -> Візуальний командний рядок Visual Studio), це розпізнається як зовнішня команда, і вам потрібно лише ввести "dumpbin".
Беміпефе

45

Я можу порекомендувати цікаве рішення для шанувальників Linux. Після того, як я вивчив це рішення, я перейшов з DependencyWalker на це.

Ви можете використовувати свій улюблений lddнад Windows , пов'язаних exe, dll.

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

$ ldd your_dll_file.dll

UPD: Ви можете використовувати lddтакож через мерзотника терміналу Баш на ОС Windows . Не потрібно встановлювати cygwin у випадку, якщо у вас вже встановлений git.


Я просто встановив cygwin і з радістю знайшов назад команди Linux, але мені не вдалося вийти з кореня Cygwin, щоб отримати доступ до інших файлів на моєму локальному диску (C :). Це нормально?
ThomasGuenet

1
Я думаю, що це може вам допомогти: stackoverflow.com/questions/1850920/…
troyane

4
На жаль, є деяка залежність, що не знайдений в такий спосіб: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Дамбін утиліти правильно показує всі залежності.
fgiraldeau

5
Я використовую ldd через термінал GIT BASH на windows і чудово працює. Тож якщо у вас є git, це буде легко, не потрібно встановлювати cygwin. Приклад: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / W / WBELE dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Борислав Марков

1
Оскільки хтось, у кого вже встановлено git bash, це було кращим рішенням. Дякую!
Ніколя

28
  1. Визначте повний шлях файлу до збірки, з якою ви намагаєтесь працювати

  2. Натисніть кнопку запуску, наберіть "dev". Запустіть програму під назвою "Командна строка розробника для VS 2017"

  3. У вікні, що відкриється, введіть dumpbin /dependents [path], де [path]знаходиться шлях, який ви з’ясували на кроці 1

  4. натисніть клавішу введення

Бам, у вас є інформація про залежність. Вікно має виглядати так:

введіть тут опис зображення

Оновлення для VS 2019: вам потрібен цей пакет у вашій установці VS:введіть тут опис зображення


9
  1. Є програма під назвою "Залежить"
  2. Якщо у вас встановлений cygwin, нічого простіше, ніж ldd file.exe

4
Інструмент називається ходовою залежністю ; його виконавче зображення має назву залежно.exe .
ІІнеочікуване

7
Уокер-залежність датований. Його останній побудований у 2008 році!
SuB

dependsне підтримує набори API, тож він марний для Win7 +.
ivan_pozdeev

8

Найбезпечніше - це мати чисту віртуальну машину, на якій можна протестувати свою програму. У кожній версії, яку ви хочете протестувати, відновіть VM до його початкового чистого значення. Потім встановіть програму, використовуючи її налаштування, і подивіться, чи працює вона.

Проблеми з dll мають різні обличчя. Якщо ви використовуєте Visual Studio і динамічно посилаєтесь на CRT, вам доведеться поширювати CRT DLL. Оновіть свій VS, і вам доведеться поширити іншу версію CRT. Просто перевірити залежності недостатньо, оскільки ви можете їх пропустити. Повна установка на чистій машині - єдине безпечне рішення, IMO.

Якщо ви не хочете налаштовувати повномасштабну тестову середу та маєте Windows 7, ви можете використовувати XP-Mode як початкову чисту машину, а XP-More - для дублювання VM.


6

На вашій розробній машині можна виконати програму та запустити Провідник процесів Sysinternals . На нижній панелі він покаже завантажені DLL-файли та поточні шляхи до них, що зручно з кількох причин. Якщо ви виконуєте свій пакет розгортання, це виявить, на які DLL посилається неправильний шлях (тобто не було упаковано правильно).

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


2

У минулому (тобто дні WinXP) я раніше залежав / покладався на Walker Dependency Walker (залежно.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, змушуючи його повзати на коліна, вас попередили.

введіть тут опис зображення

Примітка: "Оснастка завантажувача" - це процес, тому ввімкнення інтерфейсу не залишається перевіреним (використовуйте cdb або glfags -i)


2

Джессі вже згадував NDepend (якщо аналізувати .NET-код), але давайте точно пояснимо, як це може допомогти.

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

На панелі «Властивості проекту NDepend» ви можете визначити, що таке збірки додатків для аналізу (зеленим кольором), а NDepend виведе сторонні збори, які використовуються прикладними (синім кольором). Список каталогів, де можна шукати програми та сторонні збори.

NDepend Застосування програмних властивостей проекту та сторонні збори

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

NDepend Застосування властивостей проекту та сторонні збори не вирішені

Відмова: Я працюю на NDepend


1

Будь ласка, шукайте "залежно.exe" в Google, це крихітна утиліта для вирішення цього питання.


7
Зауважте, що ходувач залежностей є досить застарілим і не співпрацює з 64-бітним. Він остаточно покаже всі залежні DLL-файли, саме те, що шукає ОП, але також додає шум - ви знайдете, що у вас 32-х бітний виконуваний файл не вистачає 64-ти бітових dll і так далі ... На жаль, все ще немає кращого альтернатива.
еран

@eran Що тепер? Чи є краща альтернатива зараз? Дякую.
Нікос

@ RestlessC0bra Не те, що я знаю, але я не займаюся розробкою Windows протягом останніх 5 років. Уокер-залежник напевно мертвий, і соромно, що Microsoft не намагався оновлювати цей корисний інструмент і не відкривав його джерело, щоб інші могли зберегти його живим.
еран

1
@eran Ні DW не мертвий. Мабуть, він все ще широко використовується. Є деякі інші інструменти, але DW все ще, мабуть, найкращий.
Нікос

@ RestlessC0bra: Уокер залежності мертвий. Він ніколи не наздоганяв 64-бітні модулі. Якщо ви придивитесь уважно, багато з того широкого використання Walker залежностей призводить до питань переповнення стека, запитуючи, чому щось відбувається. Що-небудь ніколи не буває. Це просто хибний негатив / позитив. Монітор процесів повинен бути вашим бажаним інструментом.
Неочікуваний

1

Якщо у вас є вихідний код, ви можете використовувати ndepend.

http://www.ndepend.com/

Це дорого і робить набагато більше, ніж аналіз залежностей, тому може бути зайвим для того, що ви шукаєте.


3
Чи аналізує залежність для власних зображень, будучи інструментом, спеціально розробленим для .NET?
ІІнеочікуване

Можливо, ні, @IInspectable. Я не думаю, що .NET має спосіб це зробити, за винятком, можливо, використовуючи щось P-Invoke.
kayleeFrye_onDeck

@kayleeFrye_onDeck: Розбір таблиць імпорту зводиться до читання файлів. .NET може читати файли.
Неочікувана

Так! І все-таки, для цього немає .NET API :( Що ви пропонуєте? Я не є. там, але дуже мало для Windows є зручним для розповсюдження, не кажучи вже про швидкий ... Я шукав, щоб використовувати його для перевірки невідомої кількості бінарних файлів рекурсивно для виявлення фреймворків, які використовуються під час компіляції, тому я міг обробляти їх спеціальними парамами ad- Хок. Я, можливо, доведеться вивчити використання LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: В API Windows немає нічого, щоб читати таблиці імпорту модулів. Ви повинні прочитати файли та проаналізувати вміст. Немає різниці між рідним кодом та .NET. LoadLibraryExне допомагає там.
Неочікуваний

0

Проект pedeps ( https://github.com/brechtsanders/pedeps ) має інструмент командного рядка (copypedeps) для копіювання ваших .exe (або .dll) файлів (файлів), а також усіх файлів, від яких залежить. Якщо ви робите це в системі, де працює додаток, ви повинні мати можливість відправляти його з усіма залежними DLL файлами.


0

Будь ласка, перегляньте інструментарій SysInternal від Microsoft із посилання нижче, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

Перейдіть у папку для завантаження, відкрийте "Procexp64.exe" як права адміністратора. Відкрийте меню «Знайти» -> «Знайти обробку або DLL» або ярлик Ctrl + F.

введіть тут опис зображення


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.