【问题标题】:How do I detect the DLLs required by an application?如何检测应用程序所需的 DLL?
【发布时间】:2010-09-26 15:04:24
【问题描述】:

简而言之:我想做与“Dependency Walker”相同的事情。

是否有任何 Win32 API 函数可以枚举 EXE 和/或 DLL 文件的依赖关系?

是否有任何安全的方法来检测 ActiveX 类的依赖关系? (我怀疑这是可能的,但谁知道......)

编辑: 我知道提供相同核心功能的可用工具(Dependency Walker、ProcessExplorer、AQTime,...),但我想创建自己的转储文本文件的程序包含所需的模块。

【问题讨论】:

  • 您可以考虑更改问题的标题。如果你想知道如何通过 Win32 API 做到这一点,你应该在标题中说明。这不仅仅是头发分裂;其他人稍后可能会尝试查找相同的信息,并且您的标题可能会告诉他们您的问题解决了这个问题。
  • 即便如此,您仍然需要注意,如果您需要确保记录所有使用的文件,则可能需要执行应用程序的所有功能。

标签: winapi dll


【解决方案1】:

您可以编写一个控制台应用程序来包装它,使用它创建一个 PowerShell 脚本,或者就像我通常最终会做的那样,因为我只需要在蓝月亮中执行一次,将以下内容添加到您的代码中以便快速检查:

    private static HashSet<string> ReferencedAssemblies = new HashSet<string>();

    ...
    OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0);
    ...

    static void OutputDependencies(Assembly assembly, int indent)
    {
        if (assembly == null) return;

        Console.WriteLine(new String(' ', indent * 4) + assembly.FullName);
        if (!ReferencedAssemblies.Contains(assembly.FullName))
        {
            ReferencedAssemblies.Add(assembly.FullName);

            foreach (var childAssembly in assembly.GetReferencedAssemblies())
            {
                OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1);
            }
        }
    }

【讨论】:

    【解决方案2】:

    似乎 Dependency Walker 源代码本身是由 Microsoft 通过 MSJ 提供的。请 看看Re: [DUG]: Dependency Walker

    您需要参考其他网站进行下载,因为此邮件中提供的链接无效。

    请查看MSJ Source Code Updates:由于我没有时间,所以我没有检查它是否包含源代码或只有EXE foæes。

    【讨论】:

    • 您的第一个链接已损坏,而您的第二个链接指向的只是一个可执行文件。在 stackoverflow 上不鼓励仅链接的答案。
    【解决方案3】:

    运行应用程序,Process Explorer 已在运行并设置为过滤您的应用程序 .exe 名称。

    如果不运行可执行文件,就无法检测到所有 COM 依赖项。

    【讨论】:

      【解决方案4】:

      findstr -i .dll exe.exe |更多 | findstr -i .dll |更多

      rem :)

      【讨论】:

      • 完全伪造,左右产生误报和误报。将单方面报告恰好包含 ".dll" 的字符串的依赖关系,但无法确定该字符串的使用位置。无法考虑在运行时加载的 DLL(例如,通过调用 LoadLibrary,在实例化 ActiveX 控件时)。
      • 对这个答案的一厢情愿......只需一次搜索就可以轻松破坏。
      【解决方案5】:

      用户@blue... 躲到Dependency Walker。使用 Dependency Walker 时,打开文件后,您可以看到使用的基本要求。只有在执行程序并执行其所有功能时,才能找到所有动态加载的DLL。

      如果可以的话,有时最好的办法是询问开发人员需要哪些 DLL。应用程序可能仅在绝对需要时才加载一些 DLL。例如加载 faultrep.dll,用于自定义 Windows 错误报告,即将崩溃。

      【讨论】:

      • 不是真正的重新延迟加载 dll,它们像常规 dll 一样位于 exe 的导入部分。但我同意,要找到动态加载的 dll,您必须挂钩 LoadLibrary() 并在 exe 中执行所需的代码路径。
      【解决方案6】:

      您可能需要遍历可执行文件的文件结构才能以编程方式解决此问题。因此,这里提到的“PE Dump”程序:http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx 将是一个很好的起点。您需要的实际代码可以在这里找到:http://www.wheaty.net/downloads.htm

      【讨论】:

        【解决方案7】:

        以下命令转储 some.exe 的直接依赖关系:

        dumpbin /imports some.exe
        

        它也适用于 DLL。

        这不会列出依赖项,例如在应用程序启动时加载的插件(通过 LoadLibrary 调用)。 COM 依赖项也一样,因为它们的工作方式相同(据我所知)。

        如果您需要了解正在运行的程序使用的所有 DLL,请使用 ProcessExplorer。

        【讨论】:

        • dumpbin 可以通过打开 VS 201x 的开发人员命令提示符来执行。这可以从 Windows 按钮访问,向下滚动到 Visual Studio 201x 文件夹。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        相关资源
        最近更新 更多