2009-08-20 14 views
10

Sto cercando il modo di leggere tutti gli assembly (.dlls) utilizzati dalla mia app.Come ottenere i nomi delle DLL utilizzate dall'applicazione

In un progetto C# standard esiste la cartella "Riferimenti", quando è espansa posso leggere tutte le librerie utilizzate.

Il mio obiettivo è di leggere tutti gli assembly utilizzati da ciascun progetto nella mia soluzione.

Infine mi piacerebbe vedere quali librerie vengono utilizzate dalla mia applicazione compilata * .exe.

risposta

14

Hai guardato Assembly.GetReferencedAssemblies?

Nota che tutti i riferimenti che non utilizzi non finiranno per essere emessi nei metadati, quindi non li vedrai al momento dell'esecuzione.

Ho usato GetReferencedAssemblies in modo ricorsivo prima di ora per trovare un tipo con nome senza dover specificare l'assembly.

1

È possibile utilizzare AppDomain.GetAssemblies.
Tuttavia, questo consente a TUTTI gli assembly utilizzati in modo esplicito o implicito nell'applicazione.

+2

quanto ho capito esso, che darà quelli che sono già stati caricati, potrebbero essercene referenziati nei metadati, ma non sono stati ancora caricati poiché non sono stati necessari nell'esecuzione fino ad ora –

+0

Grazie per il tuo suggerimento! Anche questo AppDomain.CurrentDomain.GetAssemblies() era interessante – Maciej

0

Se si dispone di un oggetto Assembly, è possibile chiamare GetReferencedAssemblies() su di esso per ottenere eventuali riferimenti che tale assembly utilizza. Per ottenere un elenco dei gruppi di progetto attualmente in esecuzione utilizza, è possibile utilizzare:

System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies() 
0

Credo che si può utilizzare:

AssemblyName[] assemblies = this.GetType().Assembly.GetReferencedAssemblies(); 
3
System.Reflection.Assembly []ar=AppDomain.CurrentDomain.GetAssemblies(); 

foreach (System.Reflection.Assembly a in ar) 
{ 
Console.WriteLine("{0}", a.FullName); 
} 
9

Per farlo correttamente, è necessario camminare assemblee , prendendo le dipendenze ... se il tuo exe ha bisogno di Dll_A, e Dll_A ha bisogno di Dll_B (anche se l'exe non fa riferimento a esso), allora anche il tuo exe ha bisogno di Dll_B.

È possibile eseguire una query su questo (su qualsiasi assieme) tramite riflessione; ci vuole un po 'di lavoro (in particolare in guardia contro i riferimenti circolari, che accadono; ecco un esempio che parte dal "assemblea entry", ma questo potrebbe facilmente essere qualsiasi assemblea:

List<string> refs = new List<string>(); 
    Queue<AssemblyName> pending = new Queue<AssemblyName>(); 
    pending.Enqueue(Assembly.GetEntryAssembly().GetName()); 
    while(pending.Count > 0) 
    { 
     AssemblyName an = pending.Dequeue(); 
     string s = an.ToString(); 
     if(refs.Contains(s)) continue; // done already 
     refs.Add(s); 
     try 
     { 
      Assembly asm = Assembly.Load(an); 
      if(asm != null) 
      { 
       foreach(AssemblyName sub in asm.GetReferencedAssemblies()) 
       { 
        pending.Enqueue(sub); 
       } 
       foreach (Type type in asm.GetTypes()) 
       { 
        foreach (MethodInfo method in type.GetMethods(
         BindingFlags.Static | BindingFlags.Public | 
          BindingFlags.NonPublic)) 
        { 
         DllImportAttribute attrib = (DllImportAttribute) 
          Attribute.GetCustomAttribute(method, 
           typeof(DllImportAttribute)); 
         if (attrib != null && !refs.Contains(attrib.Value)) 
         { 
          refs.Add(attrib.Value); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.Error.WriteLine(ex.Message); 
     } 
    } 
    refs.Sort(); 
    foreach (string name in refs) 
    { 
     Console.WriteLine(name); 
    } 
+0

Questo rileva anche dll non gestiti che vengono utilizzati tramite PInvoke o recupera solo gestisce le DLL gestite solo da dll? –

+0

È possibile utilizzare il reflection per cercare il P/Invoke m ethods - ma sarebbe una riflessione leggermente diversa. –

+0

Come potrei farlo? La mia conoscenza della riflessione è limitata, puoi indicarmi la giusta direzione? –

Problemi correlati