2013-02-27 31 views

回答

34

如果以編程方式使用,請使用Assembly.GetReferencedAssemblies

你可以遞歸地使用它來找到你需要的所有程序集。 (所以你找到X的依賴關係,然後依賴關係等)

+0

您將需要包括 「使用的System.Reflection;」 – greenfeet 2015-07-20 08:52:45

+4

@greenfeet:不一定 - 您可以使用'var assemblies = typeof(Foo).Assembly.GetReferencedAssemblies();'例如。通常,不值得添加所有在答案中引用的類型使用的所有名稱空間 - 特別是當有鏈接到相關類型時。我假設讀者已經足夠了解C#語言以知道何時添加「using」指令。 – 2015-07-20 08:56:03

+0

你可以避免爲依賴關係的依賴添加'使用System.Reflection'嗎?你不需要在某個時候調用Assembly.LoadWithPartialName(或類似的東西)嗎? – theoski 2015-10-09 17:14:38

6

您可以使用依賴關係walker http://www.dependencywalker.com來解決這個問題。但請注意x32和x64之間的區別。

的Dependency Walker是一個免費的實用程序,它可以掃描任何32位或64位的Windows 模塊(EXE,DLL,OCX,SYS等)和生成的所有從屬模塊的分層樹 圖。

10

由於問題標記爲「C#」,我會假設你正在談論託管dll(程序集)。在這種情況下,dependencywalker沒有用處。如果你想用程序來做到這一點,好的是JetBrians的dotPeek和RedGate的Reflector。或者你甚至可以在Visual Studio中使用對象檢查器。

但是,它可能是一個漫長的過程和繁瑣的過程。正如Jon所說,我會寫一個簡短的C#程序/ F#腳本,使用Assembly.GetReferencedAssemblies

如果您想要使用程序(C#代碼)檢查本機DLL依賴項,則必須檢查PE文件(MS dll和exe文件格式)及其IAT(導入地址表)。不容易,但也不是不可能......

我將開始here on MSDNhere瞭解PE的部分,並使用託管庫讀它(有很多,其中包括一些從Mono項目(我在想Cecil ,它應該與本地二進制太)工作;在過去,我已經從良約翰·高夫使用this one

3

對於.NET組件,一個了不起的工具來查看組件的組裝取決於是AsmSpy

+2

它不列出間接程序集。 – BartoszKP 2015-09-15 12:07:34

2

所有回答的功勞都歸功於以前的作者使用Assembly.GetReferencedAssemblies。這只是一個寫和僞造t僅適用於.NET程序集的C#控制檯應用程序。 return 0您可以檢查組件,並在成功時將它們輸出到STDOUT。其他一切將return 1並打印某種錯誤輸出。你可以抓住主題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; 
     } 
    } 
} 

用法:

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 

輸出:

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