2013-02-27 14 views

Odpowiedz

34

Jeśli masz na myśli programowanie, użyj Assembly.GetReferencedAssemblies.

Możesz użyć tego rekurencyjnie, aby znaleźć wszystkie potrzebne zestawy. (Znajdziemy więc zależności X, a następnie zależności zależności, itd.)

+0

trzeba będzie zawierać "za pomocą System.Reflection;" – greenfeet

+4

@ green-end: Niekoniecznie - można użyć na przykład 'var assemblies = typeof (Foo) .Assembly.GetReferencedAssemblies();'. Ogólnie rzecz biorąc, nie warto dodawać wszystkich przestrzeni nazw używanych przez wszystkie typy wymienione w odpowiedziach - w szczególności nie wtedy, gdy istnieją odnośniki do typów, o których mowa.W pewnym sensie zakładam, że czytelnicy rozumieją wystarczającą ilość języka C#, aby wiedzieć, kiedy dodać dyrektywę "using". –

+0

Czy można uniknąć dodawania 'using System.Reflection' dla zależności zależności? Czy nie musiałbyś w pewnym momencie wywoływać Assembly.LoadWithPartialName (lub czegoś podobnego)? – theoski

6

Możesz użyć opiekuna zależności http://www.dependencywalker.com, aby to zrozumieć. Zwróć jednak uwagę na różnicę między x32 a x64.

Zależność Walker wolny narzędziowy, który skanuje wszystkie 32-bitowe lub 64-bitowe moduł Okna (EXE DLL OCX SYS, etc.) i tworzy się wykres hierarchicznej drzewa wszystkich modułów zależnych.

10

Ponieważ pytanie jest oznaczone jako "C#", zakładam, że mówimy o zarządzanych bibliotekach dll (złożeniach). W takim przypadku dependencywalker nie jest użyteczny. Jeśli chcesz to zrobić z programem, dobre są: dotPeek od JetBrians i Reflector od RedGate. Lub możesz nawet użyć inspektora obiektów w Visual Studio.

Jednak może to być długi proces i kłopotliwe zbyt. Napisałbym krótki skrypt C#/F #, który używa Assembly.GetReferencedAssemblies, jak wspomniał Jon.

Jeśli zamiast tego chcesz zbadać zależności natywnych bibliotek DLL z programem (kod C#), musisz przejść do pliku PE (plik MS dll i format pliku exe) i jego IAT (tabela adresów importu). Nie jest łatwe, ale nie niemożliwe ...

Chciałbym zacząć here on MSDN i here zrozumieć sekcje PE i używać zarządzanej biblioteki, aby ją przeczytać (istnieje wiele, w tym niektóre z projektu Mono (mam na myśli Cecil , powinien działać z rodzimych plików binarnych zbyt); w przeszłości Użyłem this one z dobrej John Gough

3

dla zespołów .NET, wspaniałe narzędzie, aby zobaczyć zespoły zespół jest zależna jest AsmSpy

+2

Nie wyświetla pośrednich złożeń. – BartoszKP

2
..

Wszystkie podziękowania należą się poprzednim autorom za korzystanie z usługi Assembly.GetReferencedAssemblies. To jest po prostu pisanie i kucie t C# aplikacja konsolowa działająca wyłącznie dla złożeń .NET. return 0 na złożeniach, które można było sprawdzić, a po pomyślnym zakończeniu, wyprowadza je do STDOUT. Cała reszta będzie return 1 i wydrukować jakiś rodzaj wyjścia błędu. Możesz pobrać istotę here.

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; 
     } 
    } 
} 

Zastosowanie:

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 

wyjściowa:

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 
Powiązane problemy