Como faço para listar todos os assemblies carregados?

101

Em .Net, gostaria de enumerar todos os assemblies carregados em todos os AppDomains. Fazer isso para o AppDomain do meu programa é bastante fácil AppDomain.CurrentDomain.GetAssemblies(). Eu preciso acessar de alguma forma cada AppDomain? Ou já existe uma ferramenta que faz isso?

Abtin Forouzandeh
fonte
1
Observe que GetAssemblies()não funcionará, pois não é recursivo e perderá todas as referências de assembly aninhado. Eu adicionei uma versão recursiva de GetAssemblies()em stackoverflow.com/questions/383686/… .
Contango
@Contango: AppDomain.CurrentDomain.GetAssemblies()está perfeitamente bem. Ele não precisa percorrer as referências recursivamente, porque não está enumerando as referências em primeiro lugar.
Ben Voigt

Respostas:

95

Usando Visual Studio

  1. Anexe um depurador ao processo (por exemplo, comece com depuração ou Depure> Anexar ao processo)
  2. Durante a depuração, mostre a janela Módulos (Depurar> Janelas> Módulos)

Isso fornece detalhes sobre cada assembly, domínio do aplicativo e tem algumas opções para carregar símbolos (ou seja, arquivos pdb que contêm informações de depuração).

insira a descrição da imagem aqui

Usando o Process Explorer

Se você quiser uma ferramenta externa, pode usar o Process Explorer (freeware, publicado pela Microsoft)

Clique em um processo e aparecerá uma lista com todas as montagens utilizadas. A ferramenta é muito boa, pois mostra outras informações, como identificadores de arquivo, etc.

Programaticamente

Verifique esta pergunta do SO que explica como fazer isso.

Bogdan Gavril MSFT
fonte
1
É ainda melhor do que explicado aqui, porque na página de propriedades de um processo, o Process Explorer mostra exatamente em quais assemblies AppDomain (incluindo o 'Domínio compartilhado') são carregados. Portanto, ele mostra mais do que apenas quais .dlls são carregados no processo. Seria bom saber quais APIs eles usam para mostrar isso (o link 'Programaticamente' sobre fornecerá apenas os Assemblies no CurrentDomain).
Govert
22

Aqui está o que eu terminei. É uma lista de todas as propriedades e métodos, e listei todos os parâmetros de cada método. Não tive sucesso em obter todos os 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
fonte
btw ... Eu excluí da postagem inicial, mas filtrou algumas das respostas assimforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d
2
Isso não responde à pergunta de forma alguma.
Govert
Em vez de usar GetExecutingAssembly (), usei GetEntryAssembly () para garantir que estou obtendo uma lista melhor de Assemblies usados ​​por meu programa. Se o ExecutingAssembly for uma DLL, vou perder alguns deles.
Harry Glinos
6
tente usar: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW