Как определить библиотеки DLL, необходимые для приложения?

Вкратце: я хочу сделать то же самое, что и "Зависимость Уокер".

Есть ли какая-либо функция Win32 API, которая может перечислять зависимости EXE и/или DLL файла?

И есть ли безопасный способ обнаружения зависимостей от классов ActiveX? (Я сомневаюсь, что это возможно, но кто знает...)

EDIT: Я знаю доступные инструменты, которые предоставляют одну и ту же базовую функциональность (Dependency Walker, ProcessExplorer, AQTime,...), но я хочу создать свою собственную программу, которая выгружает текстовый файл содержащих требуемые модули.

Ответ 1

Кажется, что сам исходный код Dependency Walker был предоставлен Microsoft через MSJ. пожалуйста посмотрите Re: [DUG]: Уклонение зависимостей.

Вам нужно указать другой сайт для загрузки, поскольку ссылка, указанная в этом почтовом трейле, не работает.

Пожалуйста, проверьте Обновления исходного кода MSJ: поскольку у меня нет времени, я не проверял, содержит ли он исходный код или только EXE foæes.

Ответ 2

Следующие команды выгружают прямые зависимости some.exe:

dumpbin /imports some.exe

Он также работает с DLL.

Это не будет отображать зависимости, такие как плагины, загружаемые при запуске приложения (через вызовы LoadLibrary). То же самое для COM-зависимостей, поскольку они работают одинаково (насколько мне известно).

Если вам нужно знать все библиотеки DLL, используемые исполняемой программой, используйте ProcessExplorer.

Ответ 3

findstr -i.dll exe.exe | больше | findstr -i.dll | подробнее

rem:)

Ответ 4

Запустите приложение, с Process Explorer уже запущен и настроен для фильтрации имени вашего приложения .exe.

Невозможно обнаружить все COM-зависимости, которые исполняемый файл имеет без запуска.

Ответ 5

Пользователь @blue... ускользнул от Dependency Walker. При использовании Dependency Walker после открытия файла вы можете увидеть базовые требования, которые используются. Только при выполнении программы и выполнении всех ее функций вы можете найти все динамически загружаемые библиотеки DLL.

Иногда самое лучшее, что можно сделать, если вы можете, спросить разработчика, какие DLL необходимы. Приложение может загружать только некоторые библиотеки DLL, когда это абсолютно необходимо. например Загрузите файл faultrep.dll для пользовательской отчетности об ошибках Windows, когда он вот-вот рухнет.

Ответ 6

Вам, вероятно, потребуется проделать файловую структуру исполняемого файла, чтобы программно ее реализовать. Поэтому что-то вроде программы PE Dump, упомянутой здесь: http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx было бы хорошей отправной точкой. Фактический код, который вам нужен, можно найти здесь: http://www.wheaty.net/downloads.htm

Ответ 7

Вы можете написать консольное приложение, чтобы обернуть это, создать с ним PowerShell script или, как обычно, в конечном итоге, так как мне нужно сделать это только один раз в голубой луне, добавьте в свой код следующее: быстрая проверка:

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