Wie liste ich alle geladenen Assemblys auf?

101

In .Net möchte ich alle geladenen Assemblys über alle AppDomains auflisten. Es ist einfach genug, dies für die AppDomain meines Programms zu tun AppDomain.CurrentDomain.GetAssemblies(). Muss ich irgendwie auf jede AppDomain zugreifen? Oder gibt es dafür bereits ein Tool?

Abtin Forouzandeh
quelle
1
Beachten Sie, dass dies GetAssemblies()nicht funktioniert, da es nicht rekursiv ist und keine verschachtelten Assemblyreferenzen fehlen. Ich habe eine rekursive Version von GetAssemblies()unter stackoverflow.com/questions/383686/… hinzugefügt .
Contango
@ Contango: AppDomain.CurrentDomain.GetAssemblies()ist vollkommen in Ordnung. Referenzen müssen nicht rekursiv durchlaufen werden, da Referenzen überhaupt nicht aufgelistet werden.
Ben Voigt
Beantwortet das deine Frage? Wie durchlaufen Sie aktuell geladene Assemblys?
UuDdLrLrSs

Antworten:

94

Verwenden von Visual Studio

  1. Hängen Sie einen Debugger an den Prozess an (z. B. beginnen Sie mit dem Debuggen oder Debug> An Prozess anhängen).
  2. Zeigen Sie beim Debuggen das Fenster Module an (Debug> Windows> Module).

Dies gibt Details zu jeder Assembly, App-Domäne und bietet einige Optionen zum Laden von Symbolen (dh PDF-Dateien, die Debug-Informationen enthalten).

Geben Sie hier die Bildbeschreibung ein

Prozess-Explorer verwenden

Wenn Sie ein externes Tool benötigen, können Sie den Process Explorer (Freeware, veröffentlicht von Microsoft) verwenden.

Klicken Sie auf einen Prozess und es wird eine Liste mit allen verwendeten Assemblys angezeigt. Das Tool ist ziemlich gut, da es andere Informationen wie Dateihandles usw. anzeigt.

Programmatisch

Überprüfen Sie diese SO- Frage, die erklärt, wie es geht.

Bogdan Gavril MSFT
quelle
1
Es ist sogar noch besser als hier erläutert, da der Prozess-Explorer auf der Eigenschaftenseite eines Prozesses genau anzeigt, in welche AppDomain-Assemblys (einschließlich der 'Shared Domain') Assemblys geladen werden. Es zeigt also mehr als nur, welche DLLs in den Prozess geladen werden. Es wäre schön zu wissen, welche APIs sie verwenden, um dies zu zeigen (der Link 'Programmatisch' gibt nur die Assemblies in der CurrentDomain an).
Govert
22

Hier ist, was ich am Ende hatte. Es ist eine Auflistung aller Eigenschaften und Methoden, und ich habe alle Parameter für jede Methode aufgelistet. Es ist mir nicht gelungen, alle Werte zu erreichen.

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
quelle
Übrigens ... Ich habe es aus dem ersten Beitrag ausgeschlossen, aber ich habe einige der Antworten wie foreach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
folgt
2
Dies beantwortet die Frage überhaupt nicht.
Govert
Anstatt GetExecutingAssembly () zu verwenden, habe ich GetEntryAssembly () verwendet, um sicherzustellen, dass ich eine bessere Liste der von meinem Programm verwendeten Assemblies erhalte. Wenn die ExecutingAssembly zufällig eine DLL ist, werde ich einige davon verpassen.
Harry Glinos
6
Versuchen Sie Folgendes: Assembly [] Assemblys = AppDomain.CurrentDomain.GetAssemblies ();
DanW