2009-01-16 5 views
15

Jak mogę uzyskać listę wszystkich zależności DLL danego pliku DLL lub EXE?Jak programowo uzyskać zależności DLL

Innymi słowy, chciałbym zrobić to samo, co narzędzie "Dependency walker", ale programowo.

Co to jest interfejs API systemu Windows (najlepiej .NET)?

Odpowiedz

9

Można użyć funkcji EnumProcessModules. Managed API, jak zasugerował kaanbardak, nie da ci listy rodzimych modułów.

Na przykład zobaczyć this page na MSDN

Jeśli trzeba statycznie analizować dll trzeba kopać w PE format i dowiedzieć się o importowanie tabel. Szczegółowe informacje można znaleźć w tej instrukcji: excellent tutorial.

+0

Zgadza się, ale można z niego korzystać tylko podczas procesu runnning. – sthiers

+0

Jeśli chcesz przeanalizować bibliotekę DLL bez jej ładowania, musisz odczytać tabelę importu. – aku

+0

Niestety, link do doskonałego samouczka jest martwy. –

4

UWAGA: Na podstawie uwag poniższym poście, przypuszczam, że to może przegapić niezarządzanymi zależności jak dobrze, ponieważ opiera się na refleksji.

Oto mały program w C# zamieszczony przez Jon Skeet z bytes.com na .NET Dependency Walker

using System; 
using System.Reflection; 
using System.Collections; 

public class DependencyReporter 
{ 
    static void Main(string[] args) 
    { 
     //change this line if you only need to run the code one: 
     string dllToCheck = @""; 

     try 
     { 
      if (args.Length == 0) 
      { 
       if (!String.IsNullOrEmpty(dllToCheck)) 
       { 
        args = new string[] { dllToCheck }; 
       } 
       else 
       { 
        Console.WriteLine 
         ("Usage: DependencyReporter <assembly1> [assembly2 ...]"); 
       } 
      } 

      Hashtable alreadyLoaded = new Hashtable(); 
      foreach (string name in args) 
      { 
       Assembly assm = Assembly.LoadFrom(name); 
       DumpAssembly(assm, alreadyLoaded, 0); 
      } 
     } 
     catch (Exception e) 
     { 
      DumpError(e); 
     } 

     Console.WriteLine("\nPress any key to continue..."); 
     Console.ReadKey(); 
    } 

    static void DumpAssembly(Assembly assm, Hashtable alreadyLoaded, int indent) 
    { 
     Console.Write(new String(' ', indent)); 
     AssemblyName fqn = assm.GetName(); 
     if (alreadyLoaded.Contains(fqn.FullName)) 
     { 
      Console.WriteLine("[{0}:{1}]", fqn.Name, fqn.Version); 
      return; 
     } 
     alreadyLoaded[fqn.FullName] = fqn.FullName; 
     Console.WriteLine(fqn.Name + ":" + fqn.Version); 

     foreach (AssemblyName name in assm.GetReferencedAssemblies()) 
     { 
      try 
      { 
       Assembly referenced = Assembly.Load(name); 
       DumpAssembly(referenced, alreadyLoaded, indent + 2); 
      } 
      catch (Exception e) 
      { 
       DumpError(e); 
      } 
     } 
    } 

    static void DumpError(Exception e) 
    { 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.WriteLine("Error: {0}", e.Message); 
     Console.WriteLine(); 
     Console.ResetColor(); 
    } 
} 
+1

Ten kod nie wyświetla modułów niezarządzanych. Mono.Cecil byłby znacznie lepszym rozwiązaniem dla kodu zarządzanego, ponieważ nie wymaga ładowania zespołów do AppDomain (i późniejsze rozładowywanie zespołów nie jest możliwe). – aku

+0

Dodano dodatkowe try/catch, jeśli jeden zespół zawodzi, pozostałe powinny być na liście. Dodano kolor do wyjątku i wpis, dzięki czemu łatwiej go odczytać. Dodano pole tekstowe, gdy chcesz tylko uruchomić F5 dla szybkiego przeglądu (jest to łatwiejsze niż dodanie do ustawień kompilacji). –

1

Aby uzyskać rodzimych zależności modułu, wierzę, powinno być ok, aby dostać od zaimportowania pliku PE za stół, oto 2 linki, które wyjaśniają, że w głębi:

http://msdn.microsoft.com/en-us/magazine/bb985992.aspx

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

Aby uzyskać zależności .NET, możemy użyć API .NET, takiego jak Assembly.Load.

Aby uzyskać wszystkie zależności modułu .NET, jak o połączeniu dwóch sposobów - zespoły .NET to po prostu plik PE z metadanymi.

-1

Aby odczytać biblioteki DLL (moduły) załadowane przez działający plik exe, użyj funkcji ToolHelp32 Tool help Documentation on MSDN.

Nie jestem pewien, co to będzie pokazywać dla .Net działającego exe (nigdy tego nie próbowałem). Ale pokazuje pełną ścieżkę, z której zostały załadowane biblioteki DLL. Często była to informacja, której potrzebowałem, próbując rozwiązać problemy z bibliotekami DLL. .Net prawdopodobnie usunęło potrzebę korzystania z tych funkcji (wyszukaj DLL Hell, aby uzyskać więcej informacji).

1

Podczas gdy to pytanie ma już zaakceptowaną odpowiedź, dokumentacja wymieniona w innych odpowiedziach, gdzie nie jest zepsuta, jest stara. Zamiast czytania przez to wszystko tylko do stwierdzenia, że ​​nie obejmuje różnic między Win32 i x64, lub innych różnic, moje podejście było takie:

C:\UnxUtils\usr\local\wbin>strings.exe E:\the-directory-I-wanted-the-info-from\*.dll > E:\TEMP\dll_strings.txt 

ten pozwolił mi używać Notepad ++ lub gvima lub cokolwiek, aby szukać biblioteki DLL, które wciąż były zależne od bibliotek MS dll z 120.dll na końcu nazwy dll, więc mogłem znaleźć te, które wymagały aktualizacji.

Można to łatwo napisać w swoim ulubionym języku.

Biorąc pod uwagę, że moje wyszukiwanie tych informacji było podyktowane VS 2015, a to pytanie było najlepszym wynikiem wyszukiwania w Google, podaję tę odpowiedź, że może być przydatne dla kogoś, kto przychodzi razem szukając ta sama rzecz.

Powiązane problemy