У меня есть коллекция DLL (скажем, 20). Как узнать все библиотеки DLL, на которые зависит конкретная DLL (скажем, DLL A)?Узнайте, какие библиотеки DLL?
ответ
Если вы имеете в виду программно, используйте Assembly.GetReferencedAssemblies
.
Вы можете использовать это рекурсивно, чтобы найти все необходимые вам сборки. (Таким образом, вы находите зависимости X, затем зависимости зависимостей и т. Д.)
Вы можете использовать ходу зависимых http://www.dependencywalker.com, чтобы понять это. Однако обратите внимание на разницу между x32 и x64.
Dependency Walker является инструментом, который сканирует любой 32-битный или 64-битные модуль для Windows (EXE, DLL, OCX, SYS и т.д.) и строит иерархическую диаграмму дерева всех зависимых модулей.
Поскольку вопрос отмечен как «C#», я бы предположил, что вы говорите об управляемых DLL (сборках). В этом случае зависимый пользователь не является полезным. Если вы хотите сделать это с помощью программы, хорошими являются dotPeek от JetBrians и Reflector от RedGate. Или вы даже можете использовать инспектора объектов в Visual Studio.
Однако, это может быть долгий процесс и громоздкий. Я бы написал короткий скрипт C#/F #, который использует Assembly.GetReferencedAssemblies
, как сказал Джон.
Если вместо этого вы хотите изучить родные DLL-зависимости с помощью программы (код C#), вам необходимо пройти проверку файла PE (файл MS dll и exe) и его таблицу адресов импорта (IAT). Не легко, но не невозможно ...
Я хотел бы начать here on MSDN и here понять PE разделов, и использовать управляемую библиотеку, чтобы прочитать его (там много, в том числе некоторые из проекта Mono (я имею в виду Cecil , он должен работать с носителями бинарных файлов тоже), в прошлом я использовал this one от хорошего Джон Гоу
Все ответы на вопросы относятся к предыдущим авторам за использование Assembly.GetReferencedAssemblies
. Это всего лишь запись и подделка t C# консольное приложение, которое работает исключительно для сборки .NET. return 0
на сборках, которые вы смогли проверить, и при успешном выполнении выводит их в STDOUT. Все остальное будет return 1
и напечатать какой-то выход ошибки. Вы можете захватить сущность here.
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
вам нужно будет включать в себя "с использованием System.Reflection;" – greenfeet
@greenfeet: Не обязательно - вы можете использовать 'var assemblylies = typeof (Foo) .Assembly.GetReferencedAssemblies();' например. В общем, не стоит добавлять все пространства имен, используемые всеми типами, на которые ссылаются ответы, особенно если нет ссылок на типы, о которых идет речь.Я предполагаю, что читатели понимают достаточно языка C#, чтобы знать, когда добавлять директиву 'using'. –
Не могли бы вы добавить 'using System.Reflection' для зависимостей зависимостей? Не нужно ли в какой-то момент ссылаться на Assembly.LoadWithPartialName (или что-то подобное)? – theoski