Comment répertorier tous les assemblys chargés?

101

Dans .Net, je voudrais énumérer tous les assemblys chargés sur tous les AppDomains. Le faire pour AppDomain de mon programme est assez simple AppDomain.CurrentDomain.GetAssemblies(). Dois-je accéder d'une manière ou d'une autre à chaque AppDomain? Ou y a-t-il déjà un outil qui fait cela?

Abtin Forouzandeh
la source
1
Notez que GetAssemblies()cela ne fonctionnera pas, car il n'est pas récursif et il manquera toutes les références d'assemblage imbriquées. J'ai ajouté une version récursive de GetAssemblies()at stackoverflow.com/questions/383686/… .
Contango
@Contango: AppDomain.CurrentDomain.GetAssemblies()c'est parfaitement bien. Il n'a pas besoin de parcourir les références de manière récursive, car il n'énumère pas les références en premier lieu.
Ben Voigt
Est-ce que cela répond à votre question? Comment parcourez-vous les assemblys actuellement chargés?
UuDdLrLrSs

Réponses:

95

Utilisation de Visual Studio

  1. Joindre un débogueur au processus (par exemple, commencer par le débogage ou Déboguer> Attacher au processus)
  2. Pendant le débogage, affichez la fenêtre Modules (Débogage> Windows> Modules)

Cela donne des détails sur chaque assembly, domaine d'application et dispose de quelques options pour charger des symboles (c'est-à-dire des fichiers pdb qui contiennent des informations de débogage).

entrez la description de l'image ici

Utilisation de Process Explorer

Si vous souhaitez un outil externe, vous pouvez utiliser Process Explorer (logiciel gratuit, publié par Microsoft)

Cliquez sur un processus et il affichera une liste avec tous les assemblages utilisés. L'outil est plutôt bon car il affiche d'autres informations telles que les descripteurs de fichiers, etc.

Programmation

Cochez cette question SO qui explique comment le faire.

Bogdan Gavril MSFT
la source
1
C'est encore mieux qu'expliqué ici, car dans la page de propriétés d'un processus, Process Explorer montre exactement dans quels assemblages AppDomain (y compris le `` domaine partagé '') sont chargés. Cela montre donc plus que les fichiers .dll chargés dans le processus. Ce serait bien de savoir quelles API ils utilisent pour montrer cela (le lien 'Programmatically' about donnera juste les assemblys dans le CurrentDomain).
Govert
22

Voici ce que j'ai fini avec. C'est une liste de toutes les propriétés et méthodes, et j'ai répertorié tous les paramètres pour chaque méthode. Je n'ai pas réussi à obtenir toutes les valeurs.

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){                      
            System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString());
            foreach(Type type in asm.GetTypes()){   
                //PROPERTIES
                foreach (System.Reflection.PropertyInfo property in type.GetProperties()){
                    if (property.CanRead){
                        Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);       
                    }
                }
                //METHODS
                var methods = type.GetMethods();
                foreach (System.Reflection.MethodInfo method in methods){               
                    Response.Write("<br><b>" + an.ToString() + "."  + type.ToString() + "." + method.Name  + "</b>");   
                    foreach (System.Reflection.ParameterInfo param in method.GetParameters())
                    {
                        Response.Write("<br><i>Param=" + param.Name.ToString());
                        Response.Write("<br>  Type=" + param.ParameterType.ToString());
                        Response.Write("<br>  Position=" + param.Position.ToString());
                        Response.Write("<br>  Optional=" + param.IsOptional.ToString() + "</i>");
                    }
                }
            }
        }
s15199d
la source
btw ... Je l'ai exclu du message initial, mais j'ai filtré certaines des réponses comme çaforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d
2
Cela ne répond pas du tout à la question.
Govert
Au lieu d'utiliser GetExecutingAssembly (), j'ai utilisé GetEntryAssembly () pour m'assurer d'obtenir une meilleure liste d'assemblys utilisés par mon programme. Si ExecutingAssembly est une DLL, je vais en manquer quelques-unes.
Harry Glinos
6
essayez d'utiliser: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW