Comment puis-je déterminer les dépendances de a.NET demande?

Comment déterminer les dépendances d'une application. Net? Dependency Walker fonctionne-t-il avec des applications gérées? J'ai téléchargé la dernière et essayé de profiler l'application, mais elle se termine sans beaucoup d'explication. Si cela ne fonctionne pas avec. net, existe-t-il un autre outil qui m'aiderait à déboguer un problème de chargement de DLL à l'exécution?

93
demandé sur Colonel Panic 2008-10-23 03:18:43

12 réponses

Dependency walker fonctionne sur les binaires win32 normaux. Tous les dll. net et exe ont une petite partie d'en - tête stub qui les fait ressembler à des binaires normaux, mais tout ce qu'il dit fondamentalement est "charger le CLR" - donc c'est tout ce que dependency walker vous dira.

Pour voir sur quelles choses votre application. Net repose réellement, vous pouvez utiliser l'excellent réflecteur . net de Red Gate. (EDIT: notez que. NET Reflector est maintenant un produit payant. ILSpy est gratuit et open source et très similaire.)

Chargez votre DLL, faites un clic droit et choisissez 'analyser' - vous verrez alors un élément "dépend" qui vous montrera toutes les autres dll (et les méthodes à l'intérieur de ces dll) dont il a besoin.

Il peut parfois devenir plus délicat, car votre application dépend de x dll, et X dll est présent, mais pour une raison quelconque ne peut pas être chargé ou localisé à l'exécution.

Pour résoudre ce genre de problèmes, Microsoft dispose d'un Assembly Binding Log Viewer qui peut afficher vous ce qui se passe à l'exécution

82
répondu Orion Edwards 2017-09-28 23:21:09

Je trouve le petit utilitaire AsmSpy un outil précieux pour résoudre les problèmes de chargement des assemblages. Il répertorie toutes les références d'assemblage des assemblages gérés, y compris les versions d'assemblage.

Exécuter dans une invite de commande dans le répertoire de la .dll, avec les arguments suivants:

asmspy . all

capture d'écran de sortie asmspy

Installez-le rapidement avec Chocolatey:

choco install asmspy
28
répondu Alexander van Trijffel 2017-03-08 12:33:37

Ouvrez le fichier d'assemblage dans ILDASM et regardez @ the .assembly extern dans le manifeste

25
répondu Jim 2011-08-25 16:03:14

Pour parcourir les dépendances de code. Net, vous pouvez utiliser les fonctionnalités de L'outil NDepend. L'outil propose:

Par exemple, une telle requête peut ressembler à:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

Et son résultat ressemble à: (notez la métrique de code Profondeur , 1 est pour les appelants directs, 2 pour les appelants de direct appelant...) (notez également le bouton Exporter vers le graphique pour exporter le résultat de la requête vers un graphique D'appel )

Dépendances NDepend parcourant la requête c # LINQ

Le graphique de dépendance ressemble à:

Graphique De Dépendance NDepend

La matrice de dépendance ressemble à:

Matrice De Dépendance NDepend

La matrice de dépendance est de facto moins intuitive que le graphique, mais elle est plus adaptée pour parcourir des sections complexes de code comme:

NDepend matrice vs graphique

avertissement: je travaille pour NDepend

16
répondu Patrick from NDepend team 2017-06-12 13:32:50

Vous n'avez pas besoin de télécharger et d'installer des applications ou des outils shareware. Vous pouvez le faire par programme à partir de. net en utilisant Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()
10
répondu Colonel Panic 2015-11-23 11:29:03

Si vous utilisez la chaîne D'outils Mono, vous pouvez utiliser l'utilitaire monodis avec l'argument --assemblyref pour lister les dépendances d'un assembly.net. Cela fonctionnera à la fois sur les fichiers .exe et .dll.

Exemple d'utilisation:

monodis --assemblyref somefile.exe

Exemple de sortie (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Exemple de sortie (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
7
répondu Alexander O'Mara 2015-03-08 05:25:18

Activer la journalisation des liaisons d'assemblage définissez la valeur de registre EnableLog dans HKLM\Software\Microsoft\Fusion sur 1. Notez que vous devez redémarrer votre application (utilisez iisreset) pour que les modifications aient un effet.

Astuce: N'oubliez pas de désactiver la journalisation fusion lorsque vous avez terminé, car il y a une pénalité de performance pour l'activer.

5
répondu Ramesh 2008-10-23 00:45:22

C'est drôle, j'ai eu un problème similaire et je n'ai rien trouvé de convenable et j'étais conscient de la bonne vieille dépendance Walker donc à la fin j'en ai écrit un moi-même.

Cela traite spécifiquement de. NET et montrera quelles Références un assembly A (et manquantes) récursivement. Il montrera également les dépendances de la bibliothèque native.

C'est gratuit (pour un usage personnel) et disponible ici pour toute personne intéressée: www.netdepends.com

www.netdepends.com

Commentaires bienvenus.

4
répondu Lloyd 2015-12-21 11:41:36

Http://www.amberfish.net/

ChkAsm vous montrera toutes les dépendances d'un assembly particulier à la fois, y compris les versions, et vous permettra facilement de rechercher des assemblys dans la liste. Fonctionne beaucoup mieux à cet effet que ILSpy (http://ilspy.net/), ce que j'avais l'habitude d'utiliser pour cette tâche.

2
répondu mhenry1384 2015-06-09 13:33:00

Un autre Add-in réflecteur pratique que j'utilise est la matrice de structure de dépendance . C'est vraiment génial de voir quelles classes utilisent quoi. En Plus, c'est gratuit.

0
répondu Richard Morgan 2009-05-13 13:09:48

Essayez de compiler votre assembly. net avec l'option --staticlink:"Namespace.Assembly" . Cela force le compilateur à extraire toutes les dépendances au moment de la compilation. S'il rencontre une dépendance qui n'est pas référencée, il donnera un message d'avertissement ou d'erreur généralement avec le nom de cet assembly.

Namespace.Assembly est l'assemblage que vous soupçonnez d'avoir le problème de dépendance. Typiquement, la liaison statique de cet assembly référencera toutes les dépendances de manière transitive.

0
répondu 2016-10-28 14:13:10

Meilleure application que je vois et utilise, afficher les DLL manquées/problématiques: http://www.dependencywalker.com/

-2
répondu user1005462 2015-10-12 10:28:13