2013-02-27 61 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