Comment vérifier la dépendance DLL?

167

Parfois, lorsque je fais un petit projet, je ne suis pas assez prudent et j'ajoute accidentellement une dépendance pour une DLL dont je ne suis pas au courant. Lorsque j'expédie ce programme à un ami ou à d'autres personnes, "il ne fonctionne pas" car "une DLL" est manquante. C'est bien sûr parce que le programme peut trouver la DLL sur mon système, mais pas sur le leur.

Existe-t-il un moyen d'analyser un exécutable pour les dépendances DLL ou d'exécuter le programme dans un environnement «propre» sans DLL pour tester pour éviter ces situations de désordre ?

orlp
la source
2
Le débogueur affiche chaque DLL qui est chargée dans la fenêtre Sortie. Les modules Debug + Windows + en présentent une liste. Assurez-vous que vous pouvez tous les expliquer. Et testez votre installateur comme vous testez votre code, utilisez une VM.
Hans Passant du
@Hans Passant: Puis-je trouver une liste complète des DLL Windows standard quelque part?
orlp le
Oui, dans c: \ windows \ system32 avec un copyright Microsoft.
Hans Passant du
2
@orlp - Vous pouvez également essayer dumpbin /dependents <program>. Je suppose que la liste sera plus pertinente que la liste de toutes les DLL dans %SYSTEM%ou %SYSTEM32%. Consultez également les options DUMPBIN sur MSDN.
jww

Réponses:

106

Essayez Dependency Walker(dernière mise à jour en 2006) ou une réécriture moderne de celui-ci appelée Dependencies.

Luchian Grigore
la source
20
J'ai lu que c'est maintenant daté, y a-t-il quelque chose de plus actuel?
TankorSmash
6
Si possible, je ne ferai confiance qu'au fournisseur de système d'exploitation d'origine, car la dépendance ddl doit être le travail du système d'exploitation. Un programme utilitaire Microsoft peut-il le faire? La ligne de commande me convient.
Robin Hsu
3
@RobinHsu: DependencyWalker était fourni avec Visual Studio jusqu'à Visual Studio 2005. La version la plus récente est incluse avec le kit de développement de pilotes Windows (et n'est pas disponible sur le site Web officiel). Pas encore officiellement un outil Microsoft, mais sanctionné, promu et annoncé par Microsoft.
IInspectable
8
dumpbinsur dépendance marcheur. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck
8
Il y a maintenant une réécriture open source partiellement faite en C #, rencontrez " Dependencies.exe ": github.com/lucasg/Dependencies . Impression de test: un peu beta-ish , mais il gère les API-sets et SxS apparemment (absents de Dependency Walker).
Stein Åsmul
219

dumpbin à partir des outils Visual Studio (dossier VC \ bin) peut vous aider ici:

dumpbin /dependents your_dll_file.dll
JeffRSon
la source
7
Petit outil pratique et évite d'avoir à installer quelque chose de nouveau lorsque VS est déjà installé.
James
13
Oui, dumpbin.exeest très utile pour comprendre /dependentset /imports. Vous pouvez également l'utiliser sur d'autres ordinateurs si vous copiez link.exeavec lui et assurez-vous que le redistribuable x86 Visual C ++ Runtime correspondant ( msvcr120.dllpour Visual Studio 2013) est disponible sur l' ordinateur cible. Certaines options ont des dépendances supplémentaires. - Au fait, ils ont foiré le nom de l'option, cela aurait dû être /PREREQUISITESplutôt que /DEPENDENTS, ils auraient dû étudier le latin.
Lumi
2
C'est tellement génial, nous l'avons ajouté à notre système de construction en tant qu'étape de vérification lorsque l'exécutable final est généré afin de ne pas dépendre de quelque chose qui n'est pas inclus dans la livraison.
Lothar
4
Le seul inconvénient est que cet outil pratique est très caché: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Si vous ouvrez la ligne de commande Visual Studio (Outils -> Invite de commandes Visual Studio), celle-ci est reconnue comme une commande externe et il vous suffit de taper «dumpbin».
Bemipefe
46

Je peux recommander une solution intéressante pour les fans de Linux. Après avoir exploré cette solution, je suis passé de DependencyWalker à celui-ci.

Vous pouvez utiliser votre favori lddsur Windows liée exe, dll.

Pour ce faire, vous devez installer Cygwin (installation de base, sans packages supplémentaires requis) sur votre Windows, puis démarrer Cygwin Terminal. Vous pouvez maintenant exécuter vos commandes Linux préférées, notamment:

$ ldd your_dll_file.dll

UPD: Vous pouvez lddégalement utiliser via le terminal git bash sous Windows . Pas besoin d'installer cygwin au cas où vous auriez déjà installé git.

troyane
la source
Je viens d'installer le cygwin et j'étais heureux de retrouver les commandes linux, mais je ne pouvais pas sortir de la racine Cygwin pour accéder à d'autres fichiers sur mon lecteur local (C :). Est-ce normal?
ThomasGuenet
1
Je pense que cela pourrait vous aider: stackoverflow.com/questions/1850920/…
troyane
4
Malheureusement, il y a des dépendances qui ne se trouvent pas ainsi: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). L'utilitaire dumpbin affiche correctement toutes les dépendances.
fgiraldeau
5
J'utilise ldd via le terminal GIT BASH sur Windows et fonctionne très bien. Donc si vous avez git, ce sera facile, pas besoin d'installer cygwin. Exemple: 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 / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
En tant que personne qui avait déjà installé git bash, c'était une solution préférable. Je vous remercie!
Nicolas
28
  1. Déterminez le chemin complet du fichier vers l'assembly avec lequel vous essayez de travailler

  2. Appuyez sur le bouton de démarrage, tapez "dev". Lancez le programme appelé «Invite de commandes du développeur pour VS 2017»

  3. Dans la fenêtre qui s'ouvre, tapez dumpbin /dependents [path], où se [path]trouve le chemin que vous avez trouvé à l'étape 1

  4. appuyez sur la touche Entrée

Bam, vous avez vos informations de dépendance. La fenêtre devrait ressembler à ceci:

entrez la description de l'image ici

Mise à jour pour VS 2019: vous avez besoin de ce package dans votre installation VS:entrez la description de l'image ici

Iamsodarncool
la source
9
  1. Il existe un programme appelé "Depends"
  2. Si vous avez installé cygwin, rien de plus simple que ldd file.exe
Artyom
la source
4
L'outil s'appelle Dependency Walker ; son image exécutable est nommée depend.exe .
IInspectable
7
Dependency Walker est daté. Sa dernière construction date de 2008!
SuB
dependsne prend pas en charge les ensembles d'API, il est donc inutile pour Win7 +.
ivan_pozdeev
8

La chose la plus sûre est d'avoir une machine virtuelle propre, sur laquelle vous pouvez tester votre programme. Sur chaque version que vous souhaitez tester, restaurez la VM à sa valeur de nettoyage initiale. Ensuite, installez votre programme en utilisant sa configuration et voyez s'il fonctionne.

Les problèmes de DLL ont des visages différents. Si vous utilisez Visual Studio et créez un lien dynamique vers le CRT, vous devez distribuer les DLL CRT. Mettez à jour votre VS et vous devez distribuer une autre version du CRT. Il ne suffit pas de vérifier les dépendances, car vous risquez de les manquer. Faire une installation complète sur une machine propre est la seule solution sûre, IMO.

Si vous ne souhaitez pas configurer un environnement de test complet et disposer de Windows 7, vous pouvez utiliser XP-Mode comme machine propre initiale et XP-More pour dupliquer la machine virtuelle.

eran
la source
6

Sur votre machine de développement, vous pouvez exécuter le programme et exécuter Sysinternals Process Explorer . Dans le volet inférieur, il vous montrera les DLL chargées et leurs chemins d'accès actuels, ce qui est pratique pour un certain nombre de raisons. Si vous exécutez votre package de déploiement, cela révélera quelles DLL sont référencées dans le mauvais chemin (c'est-à-dire qu'elles n'ont pas été correctement empaquetées).

Actuellement, notre société utilise des projets Visual Studio Installer pour parcourir l'arborescence des dépendances et générer le programme sous forme de fichiers libres. Dans VS2013, il s'agit désormais d'une extension: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Nous conditionnons ensuite ces fichiers en vrac dans un programme d'installation plus complet, mais au moins ce programme d'installation projette toutes les dépendances dot net et les dépose au même endroit et vous avertit lorsque des éléments manquent.

Shiv
la source
2

Dans le passé (c'est-à-dire les jours de WinXP), je dépendais / dépendais de DLL Dependency Walker (depend.exe) mais il y a des moments où je ne suis toujours pas en mesure de déterminer le (s) problème (s) DLL. Idéalement, nous aimerions le savoir avant l'exécution par des inspections, mais si cela ne résout pas le problème (ou prend trop de temps), vous pouvez essayer d'activer le "loader snap" comme décrit sur http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx et https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx et a brièvement mentionné l' échec de LoadLibrary; GetLastError aucune aide

AVERTISSEMENT: j'ai gâché mon Windows dans le passé en train de jouer avec gflag le faisant ramper à genoux, vous avez été prévenu.

entrez la description de l'image ici

Remarque: "Loader snap" est par processus, donc l'activation de l'interface utilisateur ne reste pas cochée (utilisez cdb ou glfags -i)

HidekiAI
la source
2

NDepend a déjà été mentionné par Jesse (si vous analysez le code .NET) mais expliquons exactement comment cela peut aider.

Existe-t-il un programme / script qui peut analyser un exécutable pour les dépendances DLL ou exécuter le programme dans un environnement «propre» sans DLL pour tester pour éviter ces situations de désordre?

Dans le panneau Propriétés du projet NDepend, vous pouvez définir quels sont les assemblys d'application à analyser (en vert) et NDepend déduira les assemblys tiers utilisés par ceux d'application (en bleu). Une liste de répertoires dans lesquels rechercher des assemblys d'applications et de tiers est fournie.

Application NDepend Project Properties et assemblys tiers

Si un assembly tiers n'est pas trouvé dans ces répertoires, il sera en mode erreur. Par exemple, si je supprime le répertoire .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319je peux voir que les assemblys tiers .NET Fx ne sont pas résolus:

Application NDepend Project Properties et assemblys tiers non résolus

Avis de non-responsabilité: je travaille pour NDepend

Patrick de l'équipe NDepend
la source
1

Veuillez rechercher "depend.exe" dans google, c'est un petit utilitaire pour gérer cela.

shiying yu
la source
7
Notez que le déambulateur de dépendance est assez daté et ne coopère pas bien avec 64 bits. Il affichera définitivement toutes les DLL dépendantes, ce que recherche l'OP, mais cela ajoute également du bruit - vous constaterez que votre exécutable 32 bits manque des DLL 64 bits et ainsi de suite ... Malheureusement, il n'y a toujours pas mieux alternative.
eran le
@eran Et maintenant? Y a-t-il une meilleure alternative maintenant? Merci.
Nikos
@ RestlessC0bra Pas que je sache, mais je n'ai pas fait de développement Windows depuis 5 ans. Dependency Walker est mort à coup sûr, et c'est dommage que Microsoft ne se soit pas donné la peine de mettre à jour cet outil utile ni d'ouvrir sa source pour que d'autres puissent le maintenir en vie.
eran
1
@eran No DW n'est pas mort. Apparemment, il est encore largement utilisé. Il existe d'autres outils, mais DW est probablement le meilleur.
Nikos
@ RestlessC0bra: Dependency Walker est mort. Il n'a jamais rattrapé les modules 64 bits. Si vous regardez de près, une grande partie de cette utilisation intensive de Dependency Walker conduit à des questions Stack Overflow, demandant pourquoi quelque chose se passe. Mais ce quelque chose n'arrive jamais. C'est juste un faux négatif / positif. Process Monitor devrait être votre outil préféré.
IInspectable le
1

Si vous avez le code source, vous pouvez utiliser ndepend.

http://www.ndepend.com/

C'est cher et fait beaucoup plus que d'analyser les dépendances, il peut donc être excessif pour ce que vous recherchez.

Jesse
la source
3
Étant un outil spécialement conçu pour .NET, analyse-t-il également les dépendances pour les images natives?
IInspectable
Probablement pas, @IInspectable. Je ne pense pas que .NET ait un moyen de faire cela, sauf peut-être en utilisant quelque chose de P-Invoke.
kayleeFrye_onDeck
@kayleeFrye_onDeck: L'analyse des tables d'importation se résume à la lecture de fichiers. .NET peut lire les fichiers.
IInspectable le
Oui! Et pourtant, il n'y a pas d'API .NET pour faire cela: (Que suggérez-vous? Je ne suis pas vraiment un programmeur .NET, juste quelqu'un qui l'utilise lorsque les solutions de niveau inférieur ne fonctionnent pas. Il existe une sélection décente d'outils d'inspection là-bas, mais très peu pour Windows sont faciles à distribuer, et encore moins rapides ... Je cherchais à l'utiliser pour inspecter une quantité inconnue de binaires récursivement pour détecter les frameworks utilisés lors de la compilation, afin que je puisse les traiter avec des paramètres spéciaux ad- hoc. Je LoadLibraryEx
devrais
1
@kayleeFrye_onDeck: Il n'y a rien dans l'API Windows non plus pour lire les tables d'import de modules. Vous devez lire les fichiers et analyser le contenu. Aucune différence entre le code natif et .NET. LoadLibraryExn'aide pas là.
IInspectable le
0

Le projet pedeps ( https://github.com/brechtsanders/pedeps ) dispose d'un outil de ligne de commande (copypedeps) pour copier votre (vos) fichier (s) .exe (ou .dll) avec tous les fichiers dont il dépend. Si vous faites cela sur le système où l'application fonctionne, vous devriez être en mesure de l'expédier avec toutes ses DLL de dépendance.

Brecht Sanders
la source
0

Veuillez vous référer à la boîte à outils SysInternal de Microsoft à partir du lien ci-dessous, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

Accédez au dossier de téléchargement, ouvrez "Procexp64.exe" en tant que privilège d'administrateur. Ouvrez le menu Rechercher-> option "Rechercher une poignée ou une DLL" ou un raccourci Ctrl + F.

entrez la description de l'image ici

Dattatraya Mengudale
la source