Подтвердить что ты не робот

Узнать зависимости всех DLL?

У меня есть коллекция DLL (скажем, 20). Как узнать все DLL, на которые зависит конкретная DLL (скажем, DLL A)?

4b9b3361

Ответ 1

Если вы имеете в виду программно, используйте Assembly.GetReferencedAssemblies.

Вы можете использовать это рекурсивно, чтобы найти все необходимые вам сборки. (Таким образом, вы найдете зависимости X, затем зависимости зависимостей и т.д.)

Ответ 2

Поскольку вопрос отмечен как "С#", я бы предположил, что вы говорите об управляемых DLL (сборках). В этом случае зависимый пользователь не является полезным. Если вы хотите сделать это с помощью программы, хорошими являются dotPeek от JetBrians и Reflector от RedGate. Или вы даже можете использовать инспектора объектов в Visual Studio.

Однако это может быть долгий процесс и громоздкий. Я бы написал короткую программу С#/F # script, которая использует Assembly.GetReferencedAssemblies, как сказал Джон.

Если вместо этого вы хотите изучить зависимости родных DLL-зависимостей с программой (код С#), вам нужно пройти проверку файла PE (файл MS dll и exe) и его таблицу адресов импорта (IAT). Не легко, но не невозможно...

Я бы начал здесь, на MSDN и здесь, чтобы понять разделы PE и использовать управляемую библиотеку для ее чтения (есть много, в том числе некоторые из проекта Mono (я думаю о Cecil, он также должен работать с родными двоичными файлами), в прошлом я использовал этот от хорошего Джона Гоу.

Ответ 3

Вы можете использовать зависимый ходок http://www.dependencywalker.com, чтобы понять это. Обратите внимание на разницу между x32 и x64.

Dependency Walker - бесплатная утилита, которая сканирует любые 32-разрядные или 64-разрядные Модуль Windows (exe, dll, ocx, sys и т.д.) И строит иерархическую диаграмма дерева всех зависимых модулей.

Ответ 4

Для сборников .NET, потрясающий инструмент для просмотра сборок сборки зависит от AsmSpy.

Ответ 5

Все ответы отвечают предыдущим авторам за использование Assembly.GetReferencedAssemblies. Это просто консольное приложение для записи и забывания С#, которое работает исключительно для сборников .NET. return 0 на сборках, которые вы смогли проверить, и при успешном выполнении выводит их в STDOUT. Все остальное будет return 1 и напечатает какой-то вывод ошибки. Вы можете взять gist здесь.

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