Comment déterminer les dépendances d'une application .NET?


106

Comment déterminer les dépendances d'une application .NET? Est -ce que la dépendance Walker travail avec des applications gérées? J'ai téléchargé la dernière version et essayé de profiler l'application, mais elle se termine sans grande 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 au moment de l'exécution?

Réponses:


94

Dependency Walker fonctionne sur les binaires win32 normaux. Toutes les dll et exe .NET ont une petite partie d'en-tête de stub qui les fait ressembler à des binaires normaux, mais tout ce qu'il dit, c'est "charger le CLR" - c'est donc tout ce que l'explorateur de dépendances vous dira.

Pour voir sur quels éléments s'appuie réellement votre application .NET, vous pouvez utiliser le très 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 dedans, faites un clic droit et choisissez «Analyser» - vous verrez alors un élément «Dépend de» qui vous montrera toutes les autres dll (et méthodes à l'intérieur de ces dll) dont il a besoin.

Cela peut parfois devenir plus compliqué, car votre application dépend de X dll et X dll est présent, mais pour une raison quelconque, elle ne peut pas être chargée ou localisée au moment de l'exécution.

Pour résoudre ce type de problèmes, Microsoft dispose d'un visualiseur de journal de liaison d'assembly qui peut vous montrer ce qui se passe au moment de l'exécution


Je pense que vous avez manqué un peu de cette URL - le .aspx a été mis dans le texte du lien. J'ai réussi à le trouver.
Brian Stewart

oh ... ouais le contrôle de démarquage mange des crochets dans les URL, et malheureusement MSDN met (VS80) dans toutes ses URL :-(
Orion Edwards

44
Notez que depuis début 2011, .NET Reflector n'est plus gratuit. Le projet ILSpy open source est très similaire.
yoyo

1
La vue du journal de liaison d'assembly v4.0.30319.1 est totalement inutilisable. Les entrées du journal ne sont pas affichées dans l'ordre chronologique et vous ne pouvez pas les trier. Il affiche les chemins qui ne rentrent pas dans le visualiseur et vous ne pouvez pas le redimensionner. C'est une perte de temps totale.
Neutrino

dependencywalker.com Vous devriez inclure les URL des choses que vous mentionnez, en particulier. s'ils fonctionnent.
toddmo

54

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

Exécutez-le dans une invite de commande dans le répertoire du .dllavec les arguments suivants:

asmspy . all

Capture d'écran de la sortie asmspy

Installez-le rapidement avec Chocolatey:

choco install asmspy

Peut-il fonctionner également sur les fichiers C # ou les vues Razor? Je crée un sous-projet en exportant certaines vues et un contrôleur à partir d'un projet mvc au moment de l'exécution. Et je veux savoir quelles dépendances sont requises par ces vues et le contrôleur afin que je puisse copier ces dépendances également au moment de l'exécution pour rendre le sous-projet publiable en tant que projet Web séparé sur IIS.
Rupendra

25

Ouvrez le fichier d'assembly dans ILDASM et regardez @ le .assembly extern dans le MANIFEST


1
Puis-je voir la version des assemblys dépendants de cette façon également? Je ne vois que le nom de la dépendance, pas sa version également.
Michael R

En fait, oui, je peux voir la version des assemblys dépendants de cette façon aussi, en cliquant sur "MANIFES T"
Michael R

1
Je préfère celui-ci - pas besoin de télécharger des utilitaires supplémentaires si vous travaillez dans un environnement de développement
Dan Field

Lors du débogage d'un plantage d'application tierce, comment installer uniquement ildasm sur le client de?
realtebo

18

Pour parcourir les dépendances de code .NET, vous pouvez utiliser les capacité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 profondeur de la métrique du code , 1 est pour les appelants directs, 2 pour les appelants des appelants directs ...) (notez également le bouton Exporter vers le graphique pour exporter le résultat de la requête vers un graphique d'appel )

Dépendances dépendantes parcourant la requête C # LINQ

Le graphe de dépendance ressemble à ceci:

Graphique de dépendance NDepend

La matrice de dépendances ressemble à ceci:

Matrice de dépendances NDepend

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

NDepend Matrix vs Graph

Avis de non-responsabilité: je travaille pour NDepend


2
Patrick aurait probablement dû mentionner qu'il est l'auteur de cet outil fantastique;). Cela vaut vraiment le détour. +1 pour l'écrire!
Mitch Wheat

1
Hé, je viens de le remarquer moi-même. J'aime lire ses articles de blog - je vais devoir essayer NDepend!
Brian Stewart

2
@MitchWheat - nom vérifie haha, "Patrick de l'équipe NDepend"
kayleeFrye_onDeck

Puis-je utiliser avec VStudio? Pour déboguer les plantages d'applications d'applications tierces sur pas mon PC
Realtebo

16

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 utilisantAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
Pour des fins de débogage, il est plus pratique de le faire via PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). A l'avantage de ne pas télécharger ou de rechercher des emplacements Windows obscurs pour les outils. +1
jpmc26

3
corrigez-moi si je me trompe, mais cela vous donnera simplement la même erreur que votre application avec une dépendance manquante, ce n'est donc pas très utile
jk.

Cela ne fonctionne que lorsque l'assembly est chargé dans un AppDomain. Les assemblys chargés pour Reflection renvoient un jeu nul.
David A. Gray

7

Si vous utilisez la chaîne d'outils Mono, vous pouvez utiliser l' monodisutilitaire avec l' --assemblyrefargument pour répertorier les dépendances d'un assembly .NET. Cela fonctionnera sur les fichiers .exeet .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

5

Activer la journalisation de la liaison d'assembly 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.

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


5

C'est drôle, j'ai eu un problème similaire et je n'ai rien trouvé de convenable et j'étais au courant du bon vieux Dependency Walker alors à la fin j'en ai écrit un moi-même.

Cela traite spécifiquement de .NET et montrera les références à un assembly (et manquantes) de manière récursive. Il affichera é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

Vos commentaires sont les bienvenus.


Veuillez ajouter la prise en charge du glisser-déposer pour l'ouverture des assemblages. Ce serait également bien si le déploiement XCOPY était disponible, ainsi que le code source.
gigaplex

Je viens de remarquer que le site Web n'a pas de liens évidents vers la section où il y a deux éditions, et que la version gratuite est à usage non commercial. Je suis tombé par hasard là-dessus en trouvant l'option "Mettre à niveau vers Professionnel" dans le menu Aide. Il devrait y avoir un avis sur la page de téléchargement indiquant que ce n'est pas gratuit pour un usage commercial.
gigaplex

@gigaplex Je vais prendre note de ces deux remerciements, je vais voir ce que je peux faire.
Lloyd

1
Shiftclick pour ouvrir une arborescence et tous les sous-éléments seraient également utiles.
TS

1
Comment m'informer des dépendances manquantes?
realtebo

2

http://www.amberfish.net/

ChkAsm vous montrera toutes les dépendances d'un assemblage 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'utilisais pour cette tâche.


1
À partir de 2019, ce site semble être une sorte de blog sommaire ...
McGuireV10

@ McGuireV10 C'est ainsi. C'est malheureux. Et un rapide google ne donne plus de résultats pour cette application.
mhenry1384

0

Un autre complément pratique de Reflector que j'utilise est la matrice de structure de dépendance . C'est vraiment génial de voir quelles classes utilisent quoi. De plus, c'est gratuit.


N'affiche pas les numéros de version, malheureusement, du moins la version qui s'installe en tant que complément de studio visuel.
mhenry1384

0

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 non référencée, il émettra un message d'avertissement ou d'erreur généralement avec le nom de cet assembly.

Namespace.Assemblyest l'assembly que vous soupçonnez d'avoir le problème de dépendance. En général, la liaison statique de cet assembly référencera toutes les dépendances de manière transitoire.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.