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?
windows
dll
dependencies
orlp
fuente
fuente
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.Respuestas:
Intente
Dependency Walker
(última actualización en 2006) o llame a una reescritura modernaDependencies
.fuente
dumpbin
sobre el caminante de dependencia. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437dumpbin
de las herramientas de Visual Studio (carpeta VC \ bin) puede ayudar aquí:fuente
dumpbin.exe
es muy útil para descubrir/dependents
y/imports
. También puede usarlo en otras máquinas si lo copialink.exe
y se asegura de que el x86 Visual C ++ Runtime Redistributable correspondiente (msvcr120.dll
para 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/PREREQUISITES
más bien que/DEPENDENTS
, deberían haber estudiado latín.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
ldd
más relacionado con Windowsexe
,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:UPD: puede usar
ldd
también a través del terminal git bash en Windows . No es necesario instalar cygwin en caso de que ya tenga instalado git.fuente
$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)
. La utilidad dumpbin muestra todas las dependencias correctamente.Calcule la ruta completa del archivo al ensamblaje con el que está tratando de trabajar
Presione el botón de inicio, escriba "dev". Inicie el programa llamado "Símbolo del sistema del desarrollador para VS 2017"
En la ventana que se abre, escriba
dumpbin /dependents [path]
, ¿dónde[path]
está la ruta que descubrió en el paso 1?presione la tecla enter
Bam, tienes tu información de dependencia. La ventana debería verse así:
Actualización para VS 2019: necesita este paquete en su instalación de VS:
fuente
fuente
depends
no admite conjuntos de API, por lo que es inútil para Win7 +.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.
fuente
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.
fuente
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í.
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)
fuente
NDepend ya fue mencionado por Jesse (si analiza el código .NET) pero expliquemos exactamente cómo puede ayudar.
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.
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.30319
puedo ver que los ensamblados de terceros .NET Fx no se resuelven:Descargo de responsabilidad: trabajo para NDepend
fuente
Busque "depe.exe" en Google, es una pequeña utilidad para manejar esto.
fuente
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.
fuente
LoadLibraryEx
...LoadLibraryEx
No ayuda allí.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.
fuente
Consulte el kit de herramientas SysInternal de Microsoft desde el siguiente enlace, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Vaya a la carpeta de descarga, abra "Procexp64.exe" como privilegio de administrador. Abra la opción Buscar menú-> "Buscar identificador o DLL" o el método abreviado Ctrl + F.
fuente
Prueba JetBrains dotPeek . Es gratis.
fuente