¿Cómo enumero todos los ensamblajes cargados?

101

En .Net, me gustaría enumerar todos los ensamblados cargados en todos los AppDomains. Hacerlo para el AppDomain de mi programa es bastante fácil AppDomain.CurrentDomain.GetAssemblies(). ¿Necesito acceder de alguna manera a cada AppDomain? ¿O ya existe una herramienta que hace esto?

Abtin Forouzandeh
fuente
1
Tenga en cuenta que GetAssemblies()no funcionará, ya que no es recursivo y perderá las referencias de ensamblado anidado. Agregué una versión recursiva de GetAssemblies()en stackoverflow.com/questions/383686/… .
Contango
@Contango: AppDomain.CurrentDomain.GetAssemblies()está perfectamente bien. No necesita recorrer las referencias de forma recursiva, porque no está enumerando referencias en primer lugar.
Ben Voigt
¿Responde esto a tu pregunta? ¿Cómo recorre los ensamblajes cargados actualmente?
UuDdLrLrSs

Respuestas:

94

Usando Visual Studio

  1. Adjunte un depurador al proceso (por ejemplo, comience con la depuración o Depurar> Adjuntar al proceso)
  2. Durante la depuración, muestre la ventana Módulos (Depurar> Windows> Módulos)

Esto brinda detalles sobre cada ensamblado, dominio de aplicación y tiene algunas opciones para cargar símbolos (es decir, archivos pdb que contienen información de depuración).

ingrese la descripción de la imagen aquí

Usando Process Explorer

Si desea una herramienta externa, puede usar Process Explorer (software gratuito, publicado por Microsoft)

Haga clic en un proceso y mostrará una lista con todos los ensamblajes utilizados. La herramienta es bastante buena ya que muestra otra información, como identificadores de archivos, etc.

Programáticamente

Consulte esta pregunta SO que explica cómo hacerlo.

Bogdan Gavril MSFT
fuente
1
Es incluso mejor de lo que se explica aquí, porque en la página de propiedades de un proceso, Process Explorer muestra exactamente en qué ensamblados de AppDomain (incluido el 'Dominio compartido') se cargan. Por lo tanto, muestra más que solo qué archivos .dll se cargan en el proceso. Sería bueno saber qué API usan para mostrar esto (el enlace 'Programáticamente' sobre solo proporcionará los ensamblados en CurrentDomain).
Govert
22

Esto es lo que terminé con. Es una lista de todas las propiedades y métodos, y enumeré todos los parámetros para cada método. No logré obtener todos los valores.

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
fuente
por cierto ... lo excluí de la publicación inicial, pero foreach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
filtré
2
Esto no responde a la pregunta en absoluto.
Govert
En lugar de usar GetExecutingAssembly (), usé GetEntryAssembly () para asegurarme de que obtengo una mejor lista de ensamblajes utilizados por mi programa. Si el ExecutingAssembly resulta ser una DLL, me perderé algunos de ellos.
Harry Glinos
6
intente usar: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW