¿Cómo detecto las DLL requeridas por una aplicación?

En pocas palabras: quiero hacer lo mismo “Dependency Walker”.

¿Hay alguna función de la API de Win32 que pueda enumerar las dependencias de un archivo EXE y / o DLL?

¿Y hay alguna forma segura de detectar dependencias en clases ActiveX? (Dudo que sea posible, pero quién sabe …)

EDIT: soy consciente de las herramientas disponibles que proporcionan la misma funcionalidad básica (Dependency Walker, ProcessExplorer, AQTime, …) pero quiero crear mi propio progtwig que vuelca un archivo de texto que contiene los módulos requeridos.

Parece que el código fuente de Dependency Walker fue dado por Microsoft a través de MSJ. Por favor, mira Re: [DUG]: Dependency Walker .

Debe remitir otro sitio para descargar, ya que el enlace que se proporciona en este seguimiento de correo no funciona.

Verifique las actualizaciones de código fuente de MSJ : dado que no tengo tiempo, no he comprobado si contiene código fuente o solo elementos EXE.

Los siguientes comandos vuelcan las dependencias directas de some.exe:

dumpbin /imports some.exe 

Funciona en DLL también.

Esto no mostrará las dependencias, como los complementos cargados en el inicio de la aplicación (a través de llamadas LoadLibrary). Lo mismo para las dependencias COM ya que funcionan de la misma manera (hasta donde yo sé).

Si necesita conocer todas las DLL utilizadas por un progtwig en ejecución, use ProcessExplorer.

findstr -i .dll exe.exe | más | findstr -i .dll | Más

rem 🙂

Ejecute la aplicación, con Process Explorer ejecutándose y configurándose para filtrar el nombre de su aplicación .exe.

No hay forma de detectar todas las dependencias COM que tiene un ejecutable sin ejecutarlo.

Probablemente necesites recorrer la estructura de archivos del ejecutable para resolverlo programáticamente. Por lo tanto, algo así como el progtwig ‘PE Dump’ que se menciona aquí: http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx sería un buen punto de partida. El código real que necesita se puede encontrar aquí: http://www.wheaty.net/downloads.htm

Usuario @blue … eludido a Dependency Walker . Al usar Dependency Walker, después de abrir el archivo puede ver los requisitos básicos que se utilizan. Solo cuando ejecuta el progtwig y ejerce todas sus funciones puede encontrar todos los archivos DLL cargados dinámicamente.

A veces, lo mejor que puede hacer si puede es preguntarle al desarrollador qué archivos DLL son necesarios. Una aplicación solo puede cargar algunos archivos DLL cuando sea absolutamente necesario. por ejemplo, cargar faultrep.dll, para informes de errores de Windows personalizados, cuando está a punto de bloquearse.

Puede escribir una aplicación de consola para concluir, crear un script de PowerShell o, como suelo terminar haciendo, ya que solo tengo que hacerlo una vez en una luna azul, agregue lo siguiente a su código para una verificación rápida:

  private static HashSet ReferencedAssemblies = new HashSet(); ... OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0); ... static void OutputDependencies(Assembly assembly, int indent) { if (assembly == null) return; Console.WriteLine(new String(' ', indent * 4) + assembly.FullName); if (!ReferencedAssemblies.Contains(assembly.FullName)) { ReferencedAssemblies.Add(assembly.FullName); foreach (var childAssembly in assembly.GetReferencedAssemblies()) { OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1); } } }