找出所有DLL的依赖关系?

Abh*_*eet 45 c# assemblies .net-assembly

我有一个DLL集合(比如20).如何找出一个特定DLL(比如DLL A)所依赖的所有DLL?

Jon*_*eet 46

如果您的意思是编程,请使用Assembly.GetReferencedAssemblies.

您可以递归地使用它来查找所需的所有程序集.(所以你找到X的依赖关系,然后是依赖关系的依赖关系等)

  • @greenfeet:不一定 - 你可以使用`var assemblies = typeof(Foo).Assembly.GetReferencedAssemblies();`例如.通常,不值得添加答案中引用的所有类型使用的所有名称空间 - 特别是当存在指向相关类型的链接时.我假设读者已经足够了解C#语言,知道何时添加`using`指令. (4认同)
  • @theoski:使用指令只是意味着你不必完全限定名字......我真的不明白你在问什么. (2认同)

Lor*_*tté 13

由于问题标记为"C#",我假设您正在讨论托管dll(程序集).在这种情况下,dependencywalker没用.如果你想用程序做到这一点,好的是JetBrians的dotPeek和RedGate的Reflector.或者您甚至可以在Visual Studio中使用对象检查器.

然而,它可能是一个漫长的过程,也很麻烦.我会写一个简短的C#程序/ F#脚本Assembly.GetReferencedAssemblies,正如Jon提到的那样.

如果您想要使用程序(C#代码)检查本机DLL依赖项,则必须检查PE文件(MS dll和exe文件格式)及其IAT(导入地址表).不容易,但并非不可能......

我将开始在这里MSDN这里了解PE的部分,并使用托管库读它(有很多,其中包括一些从Mono项目(我在想塞西尔,它应该与本地二进制工作太);在过去,我用这一个从良约翰·高夫.


Ani*_*nge 9

您可以使用依赖性walker http://www.dependencywalker.com来解决这个问题.请注意x32和x64之间的区别.

Dependency Walker是一个免费的实用程序,可以扫描任何32位或64位Windows模块(exe,dll,ocx,sys等),并构建所有相关模块的分层树形图.


kay*_*eck 7

所有答案归功于以前的作者使用Assembly.GetReferencedAssemblies.这只是一个可以随意使用的C#控制台应用程序,仅适用于.NET程序集.return 0在您能够检查的程序集上,并在成功时将它们输出到STDOUT.其他所有内容都将return 1打印出某种错误输出.你可以在这里抓住要点.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


Ale*_*fel 5

对于.NET程序集,一个很棒的工具来查看程序集所依赖的程序集是AsmSpy.

  • 它没有列出间接装配. (2认同)