2013-02-27 6 views

Antwort

34

Wenn Sie programmgesteuert meinen, verwenden Sie Assembly.GetReferencedAssemblies.

Sie können das rekursiv verwenden, um alle benötigten Baugruppen zu finden. (So ​​finden Sie die Abhängigkeiten von X, dann die Abhängigkeiten der Abhängigkeiten usw.)

+0

müssen Sie umfassen "System.Reflection verwendet;" – greenfeet

+4

@greenfeet: Nicht unbedingt - Sie könnten 'var assemblies = typeof (Foo) .Assembly.GetReferencedAssemblies();' zum Beispiel verwenden. Im Allgemeinen lohnt es sich nicht, alle Namespaces hinzuzufügen, die von allen Typen verwendet werden, auf die in den Antworten verwiesen wird - insbesondere nicht, wenn Links zu den fraglichen Typen vorhanden sind.Ich gehe davon aus, dass die Leser genug von der C# -Sprache verstehen, um zu wissen, wann eine 'using'-Direktive hinzugefügt werden muss. –

+0

Konnten Sie vermeiden, 'using System.Reflection' für die Abhängigkeiten der Abhängigkeiten hinzuzufügen? Müssten Sie nicht irgendwann Assembly.LoadWithPartialName (oder etwas Ähnliches) aufrufen? – theoski

6

Sie können die Abhängigkeit walker http://www.dependencywalker.com verwenden, um dies herauszufinden. Beachten Sie jedoch den Unterschied zwischen x32 und x64.

Dependency Walker ist ein freies Programm, das durchsucht alle 32-Bit- oder 64-Bit-Windows-Modul (EXE, DLL, OCX, sys, etc.) und baut ein hierarchisches Baumdiagramm aller abhängigen Module.

10

Da die Frage mit "C#" markiert ist, würde ich annehmen, dass Sie über verwaltete DLLs (Assemblies) sprechen. In diesem Fall ist der dependencywalker nicht nützlich. Wenn Sie das mit einem Programm machen wollen, sind dotPeek von JetBrians und Reflector von RedGate die besten. Oder Sie können sogar den Objektinspektor in Visual Studio verwenden.

Es kann jedoch ein langer Prozess und umständlich sein. Ich würde ein kurzes C# -Programm/F # -Skript schreiben, das Assembly.GetReferencedAssemblies verwendet, wie Jon erwähnte.

Wenn Sie stattdessen native DLLs-Abhängigkeiten mit einem Programm (C# -Code) untersuchen möchten, müssen Sie die PE-Datei (das MS dll- und exe-Dateiformat) und ihre IAT (Importadressentabelle) untersuchen. Nicht einfach, aber nicht unmöglich ...

würde ich anfangen here on MSDN und here zu PE Abschnitten zu verstehen und verwenden, um eine verwaltete Bibliothek, es zu lesen (es gibt viele, einige aus dem Mono-Projekt einschließlich (ich denke an Cecil , sollte es auch mit einheimischen Binärdateien arbeiten), in der Vergangenheit habe ich this one von der guten John Gough verwendet haben

3

Für .NET-Assemblies, ein hervorragendes Werkzeug auf ist AsmSpy die Baugruppen eine Baugruppe ist abhängig anzuzeigen

+2

Es werden keine indirekten Assemblys aufgelistet. – BartoszKP

2
..

Alle Antwort-Credits gehen an frühere Autoren für die Verwendung von Assembly.GetReferencedAssemblies. Dies ist nur eine Schreib-und-Schmiede t C# -Konsolen-App, die ausschließlich für .NET-Assemblys funktioniert. return 0 auf Assemblys, die Sie überprüfen konnten, und wenn sie erfolgreich sind, gibt sie sie an STDOUT aus. Alles andere wird return 1 und eine Art von Fehlerausgabe ausgeben. Sie können das Wesentliche here greifen.

using System; 
using System.Reflection; 
using System.IO; 
namespace DotNetInspectorGadget 
{ 
    class DotNetInspectorGadget 
    { 
     static int Main(string[] args) 
     { 
      if(args.GetLength(0) < 1) 
      { 
      Console.WriteLine("Add a single parameter that is your" + 
      " path to the file you want inspected."); 
      return 1; 
      } 
      try { 
       var assemblies = Assembly.LoadFile(@args[0]).GetReferencedAssemblies(); 

       if (assemblies.GetLength(0) > 0) 
       { 
        foreach (var assembly in assemblies) 
        { 
        Console.WriteLine(assembly); 
        } 
        return 0; 
       } 
      } 
      catch(Exception e) { 
      Console.WriteLine("An exception occurred: {0}", e.Message); 
      return 1; 
      } finally{} 

      return 1; 
     } 
    } 
} 

Verbrauch:

call %cd%\dotnet_inspector_gadget.exe C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ConfigCI.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.ConfigCI.Commands.dll 

Ausgang:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
Verwandte Themen