serial - Cómo obtener relaciones DLL mediante programación
dll fixer gratis (5)
Puede usar la función EnumProcessModules . API administrada como kaanbardak sugerida no le dará una lista de módulos nativos.
Por ejemplo, vea esta página en MSDN
Si necesita analizar estáticamente su dll, tiene que profundizar en el formato PE y obtener información acerca de las tablas de importación. Vea este excelente tutorial para más detalles.
¿Cómo puedo obtener la lista de todas las dependencias DLL de un archivo DLL o EXE dado?
En otras palabras, me gustaría hacer lo mismo que la herramienta "Dependency walker", pero programáticamente.
¿Cuál es la API de Windows (idealmente .NET) para eso?
Para leer las DLL (módulos) cargadas por un ejecutable ejecutable, use las funciones de ToolHelp32 Documentación de ayuda de la herramienta en MSDN .
No estoy seguro de lo que mostrará para .Net ejecutando exe (nunca lo intenté). Pero, muestra la ruta completa desde donde se cargaron las DLL. A menudo, esta era la información que necesitaba al tratar de resolver los problemas de DLL. Se supone que .Net eliminó la necesidad de usar estas funciones (busque DLL Hell para más información).
Para obtener las dependencias del módulo nativo, creo que debería estar bien obtenerlo de la tabla de importación del archivo PE, aquí hay 2 enlaces que explican en profundidad:
http://msdn.microsoft.com/en-us/magazine/bb985992.aspx
http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Para obtener las dependencias de .NET, podemos usar la API de .NET, como Assembly.Load.
Para obtener todas las dependencias de un módulo .NET, ¿qué tal combinar las 2 formas? Los ensamblados .NET son solo archivos PE con metadatos.
NOTA : en base a los comentarios de la publicación a continuación, supongo que esto también puede pasar por alto las dependencias no administradas porque se basa en la reflexión.
Aquí hay un pequeño programa de c # escrito por Jon Skeet de bytes.com en .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();
}
}
Si bien esta pregunta ya tiene una respuesta aceptada, la documentación a la que se hace referencia en las otras respuestas, donde no está rota, es antigua. En lugar de leerlo todo para descubrir que no cubre las diferencias entre Win32 y x64, u otras diferencias, mi enfoque fue el siguiente:
C:/UnxUtils/usr/local/wbin>strings.exe E:/the-directory-I-wanted-the-info-from/*.dll > E:/TEMP/dll_strings.txt
Esto me permitió usar Notepad ++ o gvim o lo que sea para buscar dlls que aún dependían de dlls de MS con 120.dll al final del nombre dll para poder encontrar los que necesitaban actualización.
Esto podría ser fácilmente guionado en su idioma favorito.
Dado que mi búsqueda de esta información fue con VS 2015 en mente, y esta pregunta fue el resultado principal de una búsqueda en Google, proporcioné esta respuesta que tal vez pueda ser útil para alguien más que busque la misma cosa.