Как программно получить зависимости DLL - PullRequest
17 голосов
/ 16 января 2009

Как получить список всех зависимостей DLL для данного файла DLL или EXE?

Другими словами, я бы хотел сделать то же самое, что и инструмент «Обходчик зависимости», но программно.

Что такое Windows (в идеале .NET) API для этого?

Ответы [ 6 ]

11 голосов
/ 16 января 2009

Вы можете использовать функцию EnumProcessModules . Управляемый API, такой как предложенный kaanbardak, не даст вам список собственных модулей.

Например, см. эту страницу в MSDN

Если вам нужно статически проанализировать вашу dll, вы должны изучить PE формат и узнать о таблицах импорта. См. Этот превосходный учебник для деталей.

4 голосов
/ 16 января 2009

ПРИМЕЧАНИЕ : Исходя из комментариев из поста ниже, я полагаю, что это может пропустить также неуправляемые зависимости, поскольку зависит от отражения.

Вот небольшая программа на c #, написанная Джоном Скитом из bytes.com на .NET Dependency Walker

using System;
using System.Reflection;
using System.Collections;

public class DependencyReporter
{
    static void Main(string[] args)
    {
        //change this line if you only need to run the code one:
        string dllToCheck = @"";

        try
        {
            if (args.Length == 0)
            {
                if (!String.IsNullOrEmpty(dllToCheck))
                {
                    args = new string[] { dllToCheck };
                }
                else
                {
                    Console.WriteLine
                        ("Usage: DependencyReporter <assembly1> [assembly2 ...]");
                }
            }

            Hashtable alreadyLoaded = new Hashtable();
            foreach (string name in args)
            {
                Assembly assm = Assembly.LoadFrom(name);
                DumpAssembly(assm, alreadyLoaded, 0);
            }
        }
        catch (Exception e)
        {
            DumpError(e);
        }

        Console.WriteLine("\nPress any key to continue...");
        Console.ReadKey();
    }

    static void DumpAssembly(Assembly assm, Hashtable alreadyLoaded, int indent)
    {
        Console.Write(new String(' ', indent));
        AssemblyName fqn = assm.GetName();
        if (alreadyLoaded.Contains(fqn.FullName))
        {
            Console.WriteLine("[{0}:{1}]", fqn.Name, fqn.Version);
            return;
        }
        alreadyLoaded[fqn.FullName] = fqn.FullName;
        Console.WriteLine(fqn.Name + ":" + fqn.Version);

        foreach (AssemblyName name in assm.GetReferencedAssemblies())
        {
            try
            {
                Assembly referenced = Assembly.Load(name);
                DumpAssembly(referenced, alreadyLoaded, indent + 2);
            }
            catch (Exception e)
            {
                DumpError(e);
            }
        }
    }

    static void DumpError(Exception e)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Error: {0}", e.Message);
        Console.WriteLine();
        Console.ResetColor();
    }
}
1 голос
/ 06 февраля 2016

Хотя на этот вопрос уже принят ответ, документация, на которую есть ссылки в других ответах, если она не нарушена, устарела. Вместо того, чтобы читать все это только для того, чтобы обнаружить, что оно не охватывает различия между Win32 и x64 или другие различия, мой подход был таков:

C:\UnxUtils\usr\local\wbin>strings.exe E:\the-directory-I-wanted-the-info-from\*.dll > E:\TEMP\dll_strings.txt

Это позволило мне использовать Notepad ++ или gvim или что-то еще для поиска dll, которые все еще зависели от dll MS с 120.dll в конце имени dll, чтобы я мог найти те, которые требовали обновления.

Это может быть легко написано на вашем любимом языке.

Учитывая, что мой поиск этой информации был сделан с учетом VS 2015, и этот вопрос был лучшим результатом поиска в Google, я предоставляю этот ответ, который, возможно, будет полезен кому-то еще, кто придет искать то же самое. вещь.

1 голос
/ 10 марта 2009

Чтобы получить собственные зависимости от модулей, я считаю, что все должно быть в порядке, чтобы получить его из таблицы импорта PE-файла, вот две ссылки, которые подробно объясняют это:

http://msdn.microsoft.com/en-us/magazine/bb985992.aspx

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

Чтобы получить зависимости .NET, мы можем использовать API .NET, например Assembly.Load.

Чтобы получить все зависимости модуля .NET, как насчет объединения двух способов - сборки .NET - это просто PE-файл с метаданными.

0 голосов
/ 08 марта 2019

Если вы не хотите загружать сборку в вашей программе, вы можете использовать DnSpy (https://www.nuget.org/packages/dnSpyLibs):

var assemblyDef = dnlib.DotNet.AssemblyDef.Load("yourDllName.dll");
var dependencies = assemblyDef.ManifestModule.GetAssemblyRefs();

Обратите внимание, что у вас есть вся необходимая информация в свойстве "ManifestModule".

0 голосов
/ 10 марта 2009

Чтобы прочитать библиотеки DLL (модули), загруженные исполняемым файлом exe, используйте функции ToolHelp32 Справка по инструменту Документация по MSDN .

Не уверен, что он покажет для .Net работает exe (я никогда не пробовал). Но он показывает полный путь от места загрузки DLL. Часто это была информация, которая мне была нужна при попытке решить проблемы с DLL. Предполагается, что в .Net устранена необходимость использования этих функций (для получения дополнительной информации ищите DLL Hell).

...