У меня есть коллекция DLL (скажем, 20). Как узнать все DLL, на которые зависит конкретная DLL (скажем, DLL A)?
Узнать зависимости всех DLL?
Ответ 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