2009-08-20 14 views
10

Szukam sposobu na odczyt wszystkich złożeń (.dll) używanych przez moją aplikację.Jak uzyskać nazwy bibliotek DLL używanych przez aplikację

W standardowym projekcie C# znajduje się folder "References", który po rozwinięciu może odczytywać wszystkie używane biblioteki.

Moim celem jest programatyczne odczytywanie wszystkich złożeń używanych przez każdy projekt w moim rozwiązaniu.

Wreszcie chciałbym zobaczyć, jakie biblioteki są używane przez moją skompilowaną aplikację * .exe.

Odpowiedz

14

Czy spojrzałeś na Assembly.GetReferencedAssemblies?

Należy pamiętać, że wszelkie odniesienia, których nie używasz, nie zostaną ostatecznie wysłane do metadanych, więc nie będą wyświetlane w czasie wykonywania.

Używałem rekurencyjnie przed rekurencją wcześniej, aby znaleźć nazwany typ bez konieczności określania złożenia.

1

Można użyć AppDomain.GetAssemblies.
Ale to da WSZYSTKIE złożenia użyte jawnie lub niejawnie w twojej aplikacji.

+2

Jak rozumiem to da te, które już zostały załadowane. Mogą istnieć te, które są przywoływane w metadanych, ale nie zostały jeszcze załadowane, ponieważ nie były potrzebne do tej pory. –

+0

Dzięki za wskazówkę! Ta AppDomain.CurrentDomain.GetAssemblies() była również interesująca – Maciej

0

Jeśli masz obiekt Assembly, możesz zadzwonić pod numer GetReferencedAssemblies(), aby uzyskać wszelkie referencje używane przez zespół. Aby uzyskać listę zespołów projekt uruchomiony używa, można użyć:

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

Chyba można użyć:

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

Aby to zrobić właściwie, trzeba chodzić zespoły , podnosząc zależności ... jeśli twój exe potrzebuje Dll_A, a Dll_A potrzebuje Dll_B (nawet jeśli exe tego nie odwołuje), to twój exe również potrzebuje Dll_B.

Możesz zapytać o to (na dowolnym zestawie) za pomocą odbicia; Wystarczy trochę pracy (zwłaszcza w celu ochrony przed odniesień kołowych, które zdarzają; oto przykład, który rozpoczyna się w „zespole wejściowej”, ale może to równie dobrze być dowolny montaż:

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

Czy wykryje to również niezarządzane biblioteki dll, które są używane przez PInvoke, czy też tylko pobiera zarządzalne biblioteki dll? –

+0

Tylko zarządzane biblioteki dll.Możesz użyć odbicia, aby wyszukać P/Invoke m etody - ale to byłaby nieco inna refleksja. –

+0

Jak to zrobić? Moja wiedza na temat refleksji jest ograniczona, czy możesz wskazać mi właściwy kierunek? –

Powiązane problemy