Как я могу получить список всех DLL-зависимостей для данного DLL файла или EXE файла?
Другими словами, я хотел бы сделать то же самое, что и инструмент "Dependency walker", но программно.
Для чего нужен API Windows (в идеале .NET)?
Как я могу получить список всех DLL-зависимостей для данного DLL файла или EXE файла?
Другими словами, я хотел бы сделать то же самое, что и инструмент "Dependency walker", но программно.
Для чего нужен API Windows (в идеале .NET)?
Вы можете использовать EnumProcessModules. Управляемый API, такой как предложенный kaanbardak, не даст вам список собственных модулей.
Например, см. эту страницу в MSDN
Если вам нужно статически анализировать вашу dll, вам нужно вставить формат PE и узнать о таблицах импорта. Подробнее см. отличный учебник.
ПРИМЕЧАНИЕ. Основываясь на комментариях из сообщения ниже, я полагаю, это может также пропустить неуправляемые зависимости, потому что он полагается на отражение.
Вот небольшая программа С#, написанная Джоном Скитом из 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();
}
}
Чтобы получить зависимости родного модуля, я считаю, что это должно быть нормально, чтобы получить его из таблицы импорта файлов PE, вот 2 ссылки, которые объясняют это в глубину:
http://msdn.microsoft.com/en-us/magazine/bb985992.aspx
http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Чтобы получить зависимости от .NET, мы можем использовать .NET API, например Assembly.Load.
Чтобы получить модуль .NET для всех зависимостей, как насчет объединения двух способов - сборки .NET - это только PE файл с метаданными.
Хотя этот вопрос уже имеет принятый ответ, документация, указанная в других ответах, где не нарушена, является старой. Вместо того, чтобы читать все это только для того, чтобы найти его, он не охватывает различия между 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, я предоставляю этот ответ, что он может быть полезен кому-то, кто приходит с поиском того же вещь.
Чтобы прочитать DLL (модули), загруженные исполняемым exe, используйте функции ToolHelp32 Инструментальная справка Документация по MSDN.
Не уверен, что он будет показывать для .NET-exe (я никогда не пробовал). Но он показывает полный путь от того, где была загружена DLL. Часто это была информация, которая мне нужна при попытке решить проблемы с DLL..Net должно было удалить необходимость использования этих функций (найдите DLL Hell для получения дополнительной информации).