Come si elencano tutti gli assembly caricati?


101

In .Net, vorrei enumerare tutti gli assembly caricati su tutti gli AppDomain. Farlo per l'AppDomain del mio programma è abbastanza facile AppDomain.CurrentDomain.GetAssemblies(). Devo in qualche modo accedere a ogni AppDomain? O esiste già uno strumento che lo fa?


1
Si noti che GetAssemblies()non funzionerà, in quanto non è ricorsivo e perderà qualsiasi riferimento ad assembly annidato. Ho aggiunto una versione ricorsiva di GetAssemblies()su stackoverflow.com/questions/383686/… .
Contango

@Contango: AppDomain.CurrentDomain.GetAssemblies()va benissimo. Non è necessario esaminare i riferimenti in modo ricorsivo, perché non enumera i riferimenti in primo luogo.
Ben Voigt

Risposte:


95

Utilizzando Visual Studio

  1. Collega un debugger al processo (es. Inizia con il debug o Debug> Allega al processo)
  2. Durante il debug, mostra la finestra Moduli (Debug> Windows> Moduli)

Fornisce dettagli su ogni assembly, dominio dell'app e alcune opzioni per caricare i simboli (ad esempio file pdb che contengono informazioni di debug).

inserisci qui la descrizione dell'immagine

Utilizzo di Process Explorer

Se vuoi uno strumento esterno puoi usare Process Explorer (freeware, pubblicato da Microsoft)

Fare clic su un processo e verrà visualizzato un elenco con tutti gli assembly utilizzati. Lo strumento è abbastanza buono in quanto mostra altre informazioni come gli handle di file ecc.

A livello di codice

Controlla questa domanda SO che spiega come farlo.


1
È anche meglio di quanto spiegato qui, perché nella pagina delle proprietà di un processo, Process Explorer mostra esattamente in quali assembly AppDomain (incluso il "dominio condiviso") vengono caricati. Quindi mostra più di un semplice file .dll caricato nel processo. Sarebbe bello sapere quali API usano per mostrare questo (il collegamento "a livello di programmazione" fornirà solo gli assembly nel CurrentDomain).
Govert

22

Ecco cosa ho ottenuto. È un elenco di tutte le proprietà e metodi e ho elencato tutti i parametri per ogni metodo. Non sono riuscito a ottenere tutti i valori.

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>");
                    }
                }
            }
        }

btw ... L'ho escluso dal post iniziale, ma ho filtrato alcune delle risposte in questo modoforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

2
Questo non risponde affatto alla domanda.
Govert

Invece di usare GetExecutingAssembly (), ho usato GetEntryAssembly () per assicurarmi di ottenere un elenco migliore di assembly usati dal mio programma. Se ExecutingAssembly è una DLL, ne perderò alcuni.
Harry Glinos

6
provare a utilizzare: Assembly [] assembly = AppDomain.CurrentDomain.GetAssemblies ();
DanW
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.