Parfois, lorsque je fais un petit projet, je ne fais pas assez attention et j'ajoute accidentellement une dépendance pour un DLL dont je ne suis pas au courant. Lorsque j'expédie ce programme à un ami ou à une autre personne, "cela ne fonctionne pas" car "une DLL" est manquant. C'est bien sûr parce que le programme peut trouver le DLL sur mon système, mais pas sur le leur.
Existe-t-il un moyen d’analyser un exécutable à la recherche de dépendances DLL ou d’exécuter le programme dans un environnement "propre", sans DLL, à des fins de test afin d’éviter ces oops?
Essayez Dependance Walker: http://www.dependencywalker.com/
dumpbin
à partir d'outils Visual Studio (dossier VC\bin) peut aider ici:
dumpbin /dependents your_dll_file.dll
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 ldd
sur exe
, dll
relatif à Windows.
Pour ce faire, vous devez installer Cygwin (installation de base, sans qu'aucun paquet supplémentaire ne soit nécessaire) sur votre Windows, puis démarrez simplement Cygwin Terminal
. Vous pouvez maintenant exécuter vos commandes Linux préférées, notamment:
$ ldd your_dll_file.dll
UPD: Vous pouvez aussi utiliser ldd
via terminal git bash sous Windows . Pas besoin d'installer cygwin au cas où vous avez déjà installé Git.
Appuyez sur le bouton de démarrage, tapez "dev". Lancez le programme intitulé "Invite de commandes du développeur pour VS 2017".
Déterminez le chemin d'accès complet à l'ensemble avec lequel vous essayez de travailler.
Dans la fenêtre qui s'ouvre, tapez dumpbin /dependents [path]
, où [path]
représente le chemin que vous avez défini à l'étape 2.
appuyez sur la touche entrée
Bam, vous avez vos informations de dépendance. La fenêtre devrait ressembler à ceci:
Le plus sûr 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 si cela fonctionne.
Les problèmes de DLL ont des visages différents. Si vous utilisez Visual Studio et que vous établissez un lien dynamique avec le tube cathodique, vous devez distribuer les DLL du tube cathodique. Mettez à jour votre VS et vous devez distribuer une autre version du tube cathodique. Vérifier les dépendances ne suffit pas, vous risquez de les manquer. Effectuer 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 que vous utilisez Windows 7, vous pouvez utiliser XP-Mode comme ordinateur propre initial et XP-More pour dupliquer la machine virtuelle.
Sur votre ordinateur 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, les DLL qui sont référencées dans le mauvais chemin seront révélées (c’est-à-dire que le package n’a pas été correctement emballé).
Actuellement, notre société utilise des projets Visual Studio Installer pour parcourir l’arborescence des dépendances et produire en tant que fichiers volants le programme. Dans VS2013, il s'agit maintenant d'une extension: https://visualstudiogallery.msdn.Microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Nous regroupons ensuite ces fichiers volants dans un programme d’installation plus complet, mais au moins cette configuration projette toutes les dépendances du réseau de points et les dépose au même endroit et vous avertit lorsque des éléments manquent.
Dans le passé (c’est-à-dire les jours WinXP), je dépendais/dépendais de DLL Dependency Walker (depend.exe), mais il m'est parfois impossible de déterminer le DLL problèmes). Idéalement, nous aimerions le savoir avant l'exécution à l'aide d'inspections, mais si cela ne résout pas le problème (ou prend trop de temps), vous pouvez essayer d'activer le "cliché du chargeur" 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 brièvement mentionné LoadLibrary échoue; GetLastError sans aide
AVERTISSEMENT: dans le passé, j'ai gâché ma fenêtre en jouant avec gflag, la faisant ramper jusqu'aux genoux, vous avez été prévenu.
Remarque: "L'accrochage du chargeur" correspond à un processus, de sorte que l'activation de l'interface utilisateur ne reste pas vérifiée (utilisez cdb ou glfags -i).
S'il vous plaît recherchez "depend.exe" dans Google, c'est un petit utilitaire pour gérer cela.
NDepend a déjà été mentionné par Jesse (si vous analysez du code .NET) mais expliquons exactement comment cela peut aider.
Existe-t-il un programme/script capable d'analyser un exécutable à la recherche de dépendances DLL ou d'exécuter le programme dans un environnement "propre", sans DLL, à des fins de test afin d'éviter ces problèmes?
Dans le panneau Propriétés du projet NDepend, vous pouvez définir quels sont les assemblages d'application à analyser (en vert) et . NDepend déduira les assemblys tiers utilisés par ceux de l'application (en bleu). Une liste de répertoires dans lesquels rechercher des assemblys d'application et tiers est fournie.
Si un assemblage tiers n'est pas trouvé dans ces répertoires, il se trouvera en mode erreur. Par exemple, si je supprime le répertoire .NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
, je constate que les assemblys tiers .NET Fx ne sont pas résolus:
Avertissement: je travaille pour NDepend
Si vous avez le code source, vous pouvez utiliser ndepend.
C'est coûteux et fait beaucoup plus que d'analyser les dépendances, ce qui peut être excessif pour ce que vous recherchez.
Essayez JetBrains dotPeek . C'est gratuit.
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
Allez dans le dossier de téléchargement, ouvrez "Procexp64.exe" en tant que privilège administrateur. Ouvrez le menu Trouver-> option "Trouver poignée ou DLL" ou raccourci Ctrl + F.