¿Cómo verificar la dependencia de DLL?

165

A veces, cuando estoy haciendo un pequeño proyecto, no soy lo suficientemente cuidadoso y accidentalmente agrego una dependencia para una DLL que no conozco. Cuando envío este programa a un amigo u otras personas, "no funciona" porque falta "alguna DLL". Por supuesto, esto se debe a que el programa puede encontrar la DLL en mi sistema, pero no en la de ellos.

¿Hay alguna manera de escanear un archivo ejecutable en busca de dependencias de DLL o ejecutar el programa en un entorno libre de DLL "limpio" para realizar pruebas para evitar estos Oops situaciones?

orlp
fuente
2
El depurador muestra cada DLL que se carga en la ventana Salida. Debug + Windows + Modules muestra una lista de ellos. Asegúrese de que puede dar cuenta de todos ellos. Y pruebe su instalador como prueba su código, use una VM.
Hans Passant
@Hans Passant: ¿Puedo encontrar una lista completa de las DLL estándar de Windows en alguna parte?
orlp
Sí, en c: \ windows \ system32 con un copyright de Microsoft.
Hans Passant
2
@orlp: también puedes intentarlo dumpbin /dependents <program>. Supongo que la lista será más relevante que enumerar todas las DLL en %SYSTEM%o %SYSTEM32%. Consulte también las opciones de DUMPBIN en MSDN.
jww

Respuestas:

103

Intente Dependency Walker(última actualización en 2006) o llame a una reescritura moderna Dependencies.

Luchian Grigore
fuente
20
He leído que esto está fechado, ¿hay algo más actual?
TankorSmash
66
Si es posible, confiaré solo en el proveedor del sistema operativo original, ya que la dependencia ddl debería ser un trabajo del sistema operativo. ¿Algún programa de utilidad de Microsoft puede hacer esto? La línea de comando está bien para mí.
Robin Hsu
3
@RobinHsu: DependencyWalker solía enviarse con Visual Studio hasta Visual Studio 2005. La compilación más reciente se incluye con el Kit de desarrollo de controladores de Windows (y no está disponible a través del sitio web oficial). Todavía no es oficialmente una herramienta de Microsoft, pero es sancionada, promovida y publicitada por Microsoft.
Inspeccionable
8
dumpbinsobre el caminante de dependencia. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck
8
Ahora hay una reescritura de código abierto parcialmente realizada en C #, conozca " Dependencies.exe ": github.com/lucasg/Dependencies . Impresión de prueba: un poco beta-ish , pero aparentemente maneja conjuntos de API y SxS (falta en Dependency Walker).
Stein Åsmul
216

dumpbin de las herramientas de Visual Studio (carpeta VC \ bin) puede ayudar aquí:

dumpbin /dependents your_dll_file.dll
JeffRSon
fuente
77
Pequeña herramienta práctica, y ahorra tener que instalar algo nuevo cuando ya tienes VS instalado.
James
13
Sí, dumpbin.exees muy útil para descubrir /dependentsy /imports. También puede usarlo en otras máquinas si lo copia link.exey se asegura de que el x86 Visual C ++ Runtime Redistributable correspondiente ( msvcr120.dllpara Visual Studio 2013) esté disponible en la máquina de destino. Algunas opciones tienen dependencias adicionales. - Por cierto, arruinaron el nombre de la opción, debería haber sido /PREREQUISITESmás bien que /DEPENDENTS, deberían haber estudiado latín.
Lumi
2
Es genial, agregamos esto a nuestro sistema de compilación como un paso de verificación cuando se genera el ejecutable final para que no dependamos de algo que no está incluido en el envío.
Lothar
44
El único inconveniente es que esta práctica herramienta está muy oculta: c: \ Archivos de programa (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Si abre la línea de comando de Visual Studio (Herramientas -> Símbolo del sistema de Visual Studio), esto se reconoce como un comando externo y solo necesita escribir "dumpbin".
Bemipefe el
45

Puedo recomendar una solución interesante para los fanáticos de Linux. Después de explorar esta solución, he cambiado de DependencyWalker a esto.

Puede utilizar su favorito lddmás relacionado con Windows exe, dll.

Para hacer esto, necesita instalar Cygwin (instalación básica, sin paquetes adicionales necesarios) en su Windows y luego simplemente comenzar Cygwin Terminal. Ahora puede ejecutar sus comandos de Linux favoritos, que incluyen:

$ ldd your_dll_file.dll

UPD: puede usar lddtambién a través del terminal git bash en Windows . No es necesario instalar cygwin en caso de que ya tenga instalado git.

troyane
fuente
Acabo de instalar el cygwin y me alegré de encontrar los comandos de Linux, pero no pude salir de la raíz de Cygwin para acceder a otros archivos en mi disco local (C :). ¿Eso es normal?
ThomasGuenet
1
Creo que esto podría ayudarte: stackoverflow.com/questions/1850920/…
troyane
44
Por desgracia, hay algunas dependencias que no se encuentran de esta manera: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). La utilidad dumpbin muestra todas las dependencias correctamente.
fgiraldeau
55
Utilizo ldd a través del terminal GIT BASH en Windows y funciona bien. Entonces, si tiene git, será fácil, no necesita instalar cygwin. Ejemplo: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
Como alguien que ya tenía instalado git bash, esta era una solución preferible. ¡Gracias!
Nicolas
28
  1. Calcule la ruta completa del archivo al ensamblaje con el que está tratando de trabajar

  2. Presione el botón de inicio, escriba "dev". Inicie el programa llamado "Símbolo del sistema del desarrollador para VS 2017"

  3. En la ventana que se abre, escriba dumpbin /dependents [path], ¿dónde [path]está la ruta que descubrió en el paso 1?

  4. presione la tecla enter

Bam, tienes tu información de dependencia. La ventana debería verse así:

ingrese la descripción de la imagen aquí

Actualización para VS 2019: necesita este paquete en su instalación de VS:ingrese la descripción de la imagen aquí

Iamsodarncool
fuente
9
  1. Hay un programa llamado "Depende"
  2. Si tiene instalado Cygwin, nada más simple que ldd file.exe
Artyom
fuente
44
La herramienta se llama Dependency Walker ; su imagen ejecutable se llama depende.exe .
Inspeccionable
77
Dependency Walker tiene fecha. ¡Su última construcción es en 2008!
SuB
dependsno admite conjuntos de API, por lo que es inútil para Win7 +.
ivan_pozdeev
8

Lo más seguro es tener una máquina virtual limpia, en la que pueda probar su programa. En cada versión que desee probar, restaure la VM a su valor de limpieza inicial. Luego instale su programa usando su configuración y vea si funciona.

Los problemas de dll tienen caras diferentes. Si usa Visual Studio y se vincula dinámicamente a la CRT, debe distribuir las DLL de CRT. Actualice su VS y tendrá que distribuir otra versión de la CRT. Simplemente verificar las dependencias no es suficiente, ya que puede pasarlas por alto. Hacer una instalación completa en una máquina limpia es la única solución segura, IMO.

Si no desea configurar un entorno de prueba completo y tiene Windows 7, puede usar el modo XP como máquina limpia inicial y XP-More para duplicar la VM.

eran
fuente
6

En su máquina de desarrollo, puede ejecutar el programa y ejecutar Sysinternals Process Explorer . En el panel inferior, le mostrará los archivos DLL cargados y las rutas actuales a ellos, lo que es útil por varias razones. Si está ejecutando su paquete de implementación, revelará qué archivos DLL se referencian en la ruta incorrecta (es decir, no se empaquetaron correctamente).

Actualmente, nuestra compañía utiliza proyectos de Visual Studio Installer para recorrer el árbol de dependencias y generar como archivos sueltos el programa. En VS2013, ahora es una extensión: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Luego empaquetamos estos archivos sueltos en un instalador más completo, pero al menos esa configuración proyecta todas las dependencias de la red de puntos y las coloca en un solo lugar y le advierte cuando faltan cosas.

Shiv
fuente
2

En el pasado (es decir, en los días de WinXP), solía depender / depender de DLL Dependency Walker (depende.exe), pero hay ocasiones en que todavía no puedo determinar los problemas de DLL. Idealmente, nos gustaría averiguarlo antes del tiempo de ejecución mediante inspecciones, pero si eso no lo resuelve (o toma demasiado tiempo), puede intentar habilitar el "complemento del cargador" como se describe en http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx y https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx y falla brevemente en LoadLibrary; GetLastError sin ayuda

ADVERTENCIA: He estropeado mi Windows en el pasado engañando con gflag haciéndolo arrastrarse de rodillas, te advertí.

ingrese la descripción de la imagen aquí

Nota: "Loader snap" es por proceso, por lo que la habilitación de la interfaz de usuario no permanecerá marcada (use cdb o glfags -i)

HidekiAI
fuente
2

NDepend ya fue mencionado por Jesse (si analiza el código .NET) pero expliquemos exactamente cómo puede ayudar.

¿Existe un programa / script que pueda escanear un ejecutable en busca de dependencias de DLL o ejecutar el programa en un entorno libre de DLL "limpio" para realizar pruebas para evitar estas situaciones?

En el panel Propiedades del proyecto NDepend, puede definir qué son los ensamblajes de aplicación para analizar (en verde) y NDepend inferirá los ensamblados de terceros utilizados por los de la aplicación (en azul). Se proporciona una lista de directorios donde buscar aplicaciones y ensambles de terceros.

Aplicación de propiedades de proyecto NDepend y ensamblados de terceros

Si no se encuentra un ensamblado de terceros en estos directorios, estará en modo de error. Por ejemplo, si elimino el directorio .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319puedo ver que los ensamblados de terceros .NET Fx no se resuelven:

La aplicación de propiedades del proyecto NDepend y los ensamblados de terceros no se han resuelto

Descargo de responsabilidad: trabajo para NDepend

Patrick del equipo NDepend
fuente
1

Busque "depe.exe" en Google, es una pequeña utilidad para manejar esto.

shiying yu
fuente
77
Tenga en cuenta que el caminante de dependencias está bastante anticuado y no coopera bien con 64 bits. Mostrará definitivamente todas las DLL dependientes, que es lo que está buscando el OP, pero también agrega ruido: encontrará que su ejecutable de 32 bits no tiene algunos dlls de 64 bits, etc. Lamentablemente, todavía no hay nada mejor. alternativa.
eran el
@eran ¿Y ahora qué? ¿Hay una mejor alternativa ahora? Gracias.
Nikos
@ RestlessC0bra No que yo sepa, pero no he estado haciendo desarrollo de Windows en los últimos 5 años. Dependency Walker está muerto con seguridad, y es una pena que Microsoft no se haya molestado en actualizar esta herramienta útil ni haya abierto su fuente para que otros puedan mantenerla viva.
eran
1
@eran No DW no está muerto. Aparentemente todavía se usa ampliamente. Hay algunas otras herramientas, pero DW sigue siendo probablemente la mejor.
Nikos
@ RestlessC0bra: Dependency Walker está muerto. Nunca se puso al día con los módulos de 64 bits. Si miras lo suficientemente de cerca, gran parte de ese uso extenso de Dependency Walker lleva a preguntas de desbordamiento de pila, preguntando por qué sucede algo. Sin embargo, ese algo nunca sucede. Es solo un falso negativo / positivo. Process Monitor debería ser su herramienta preferida.
Inspeccionable el
1

Si tiene el código fuente, puede usar ndepend.

http://www.ndepend.com/

Es costoso y hace mucho más que analizar dependencias, por lo que puede ser excesivo para lo que está buscando.

Jesse
fuente
3
Al ser una herramienta diseñada específicamente para .NET, ¿analiza también las dependencias de las imágenes nativas?
Inspeccionable
Probablemente no, @IInspectable. No creo que .NET tenga una manera de hacerlo, excepto posiblemente usando algo P-Invoke.
kayleeFrye_onDeck
@kayleeFrye_onDeck: analizar tablas de importación se reduce a leer archivos. .NET puede leer archivos.
Inspeccionable el
¡Sí! Y, sin embargo, no hay API .NET para hacer esto :( ¿Qué sugieres? No soy realmente un programador .NET, solo alguien que lo usa cuando las soluciones de nivel inferior no funcionan. Hay una buena selección de herramientas de inspección por ahí, pero muy pocos para Windows son fáciles de distribuir, y mucho menos rápido ... Estaba buscando usarlo para inspeccionar una cantidad desconocida de binarios de forma recursiva para detectar marcos utilizados cuando se compila, para poder tratarlos con parámetros especiales. hoc. Puede que tenga que buscar usar LoadLibraryEx...
kayleeFrye_onDeck
1
@kayleeFrye_onDeck: No hay nada en la API de Windows para leer tablas de importación de módulos. Tienes que leer los archivos y analizar el contenido. No hay diferencia entre el código nativo y .NET. LoadLibraryExNo ayuda allí.
Inspeccionable el
0

El proyecto pedeps ( https://github.com/brechtsanders/pedeps ) tiene una herramienta de línea de comando (copypedeps) para copiar sus archivos .exe (o .dll) junto con todos los archivos de los que depende. Si lo hace en el sistema donde funciona la aplicación, debería poder enviarla con todas sus DLL de dependencia.

Brecht Sanders
fuente