¿Cómo determino las dependencias de una aplicación .NET?

106

¿Cómo determino las dependencias de una aplicación .NET? ¿ Dependency Walker funciona con aplicaciones administradas? Descargué la última versión e intenté crear un perfil de la aplicación, pero se cierra sin mucha explicación. Si no funciona con .NET, ¿existe alguna otra herramienta que me ayude a depurar un problema de carga de DLL en tiempo de ejecución?

Brian Stewart
fuente

Respuestas:

94

Dependency Walker funciona en binarios win32 normales. Todos los .NET dll y exe tienen una pequeña parte de encabezado stub que los hace parecer binarios normales, pero básicamente todo lo que dice es "cargue el CLR", así que eso es todo lo que el analizador de dependencias le dirá.

Para ver en qué cosas se basa realmente su aplicación .NET, puede usar el excelente reflector .NET de Red Gate. (EDITAR: tenga en cuenta que .NET Reflector ahora es un producto pago. ILSpy es gratuito, de código abierto y muy similar).

Cargue su DLL en él, haga clic con el botón derecho y elija 'Analizar'; luego verá un elemento "Depende de" que le mostrará todas las otras DLL (y métodos dentro de esas DLL) que necesita.

Sin embargo, a veces puede ser más complicado, ya que su aplicación depende de X dll y X dll está presente, pero por alguna razón no se puede cargar o ubicar en tiempo de ejecución.

Para solucionar ese tipo de problemas, Microsoft tiene un visor de registro de enlace de ensamblado que puede mostrarle lo que está sucediendo en tiempo de ejecución.

Orion Edwards
fuente
Creo que te perdiste un poco de esa URL: el .aspx se colocó en el texto del enlace. Aunque me las arreglé para encontrarlo.
Brian Stewart
oh ... sí, el control de rebajas come corchetes en las URL, y desafortunadamente MSDN pone (VS80) en todas sus URL :-(
Orion Edwards
44
Tenga en cuenta que a principios de 2011, .NET Reflector ya no es gratuito. El proyecto ILSpy de código abierto es muy similar.
yoyo
1
La vista de registro de enlace de ensamblajes v4.0.30319.1 es completamente inutilizable. Las entradas del registro no se muestran en orden cronológico y no puede ordenarlas. Muestra rutas que no caben en el visor y no puede cambiar su tamaño. Es una completa pérdida de tiempo.
Neutrino
dependencywalker.com Debe incluir direcciones URL de las cosas que menciona, especialmente. si funcionan.
toddmo
54

Considero que la pequeña utilidad AsmSpy es una herramienta invaluable para resolver problemas con la carga de ensamblajes. Enumera todas las referencias de ensamblado de ensamblados administrados, incluidas las versiones de ensamblado.

Ejecútelo en un símbolo del sistema en el directorio de .dllcon los siguientes argumentos:

asmspy . all

captura de pantalla de salida asmspy

Instálelo rápidamente con Chocolatey:

choco install asmspy
Alexander van Trijffel
fuente
¿Puede funcionar también en los archivos C # o en las vistas de Razor? Estoy creando un subproyecto exportando algunas de las vistas y un controlador de un proyecto mvc en tiempo de ejecución. Y quiero saber qué dependencias requieren estas Vistas y el controlador para poder copiar estas dependencias también en tiempo de ejecución para que el subproyecto sea publicable como un proyecto web separado en IIS.
Rupendra
25

Abra el archivo de ensamblaje en ILDASM y mire @ el .assembly externo en el MANIFIESTO

Jim
fuente
1
¿Puedo ver la versión de los ensamblados dependientes de esta manera también? Solo veo el nombre de la dependencia, no también su versión.
Michael R
De hecho, sí, puedo ver la versión de los ensamblados dependientes de esta manera también, al hacer clic en "MANIFIES T"
Michael R
1
Prefiero este: no es necesario descargar ninguna utilidad adicional si está trabajando en un entorno de desarrollo
Dan Field
Al depurar el bloqueo de una aplicación de terceros, ¿cómo instalar solo ildasm en el cliente de?
realtebo
18

Para examinar las dependencias del código .NET, puede utilizar las capacidades de la herramienta NDepend. La herramienta propone:

Por ejemplo, dicha consulta puede tener este aspecto:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

Y su resultado se ve así: (observe la profundidad de la métrica del código , 1 es para llamantes directos, 2 para llamadores de llamantes directos ...) (observe también el botón Exportar a gráfico para exportar el resultado de la consulta a un Gráfico de llamada )

Dependencias NDepend navegando a través de la consulta C # LINQ

El gráfico de dependencia se ve así:

Gráfico de dependencia de NDepend

La matriz de dependencia se ve así:

Matriz de dependencia NDepend

La matriz de dependencia es de facto menos intuitiva que el gráfico, pero es más adecuada para navegar por secciones complejas de código como:

NDepend Matriz vs Gráfico

Descargo de responsabilidad: trabajo para NDepend

Patrick del equipo NDepend
fuente
2
Patrick probablemente debería haber mencionado que es el autor de esa fantástica herramienta;). Realmente vale la pena echarle un vistazo. +1 por escribirlo!
Mitch Wheat
1
Oye, acabo de notar esto yo mismo. Disfruto leyendo las publicaciones de su blog. ¡Tendré que probar NDepend!
Brian Stewart
2
@MitchWheat - el nombre echa jaja, "Patrick del equipo NDepend"
kayleeFrye_onDeck
¿Puedo usarlo con VStudio? Para depurar fallos de aplicaciones de aplicaciones de terceros que no están en mi pc
realtebo
16

No es necesario descargar e instalar aplicaciones o herramientas de shareware. Puede hacerlo programáticamente desde .NET usandoAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()
Coronel Panic
fuente
9
Para propósitos de depuración, es más conveniente hacerlo a través de PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Tiene la gran ventaja de no descargar ni buscar herramientas en ubicaciones oscuras de Windows. +1
jpmc26
3
corrígeme si me equivoco, pero esto te dará el mismo error que da tu aplicación con una dependencia faltante, por lo que no es muy útil
jk.
Esto solo funciona cuando el ensamblado se carga en un AppDomain. Los ensamblados cargados para Reflection devuelven un conjunto nulo.
David A. Gray
7

Si está utilizando la cadena de herramientas Mono, puede utilizar la monodisutilidad con el --assemblyrefargumento para enumerar las dependencias de un ensamblado .NET. Esto funcionará en archivos .exey .dll.

Uso de ejemplo:

monodis --assemblyref somefile.exe

Salida de ejemplo (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Salida de ejemplo (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
Alexander O'Mara
fuente
5

Habilitar registro de enlace de ensamblado establezca el valor de registro EnableLog en HKLM \ Software \ Microsoft \ Fusion en 1. Tenga en cuenta que debe reiniciar su aplicación (use iisreset) para que los cambios surtan efecto.

Sugerencia: recuerde desactivar el registro de fusión cuando haya terminado, ya que hay una penalización de rendimiento al activarlo.

Ramesh
fuente
5

Es curioso que tuve un problema similar y no encontré nada adecuado y estaba al tanto del viejo Dependency Walker, así que al final escribí uno yo mismo.

Esto trata con .NET específicamente y mostrará qué referencias tiene (y faltan) un ensamblado de forma recursiva. También mostrará las dependencias de la biblioteca nativa.

Es gratis (para uso personal) y está disponible aquí para cualquier interesado: www.netdepends.com

www.netdepends.com

Comentarios bienvenidos.

Lloyd
fuente
Agregue soporte para arrastrar y soltar para abrir ensamblajes. También sería bueno si la implementación de XCOPY estuviera disponible, así como el código fuente.
gigaplex
Acabo de notar que el sitio web no tiene enlaces obvios a la sección donde hay dos ediciones, y la gratuita es para uso no comercial. Me topé accidentalmente con esto al encontrar la opción "Actualizar a profesional" en el menú Ayuda. Debería haber un aviso en la página de descarga que diga que no es gratuito para uso comercial.
gigaplex
@gigaplex Tomaré nota de ambos agradecimientos, veré qué puedo hacer.
Lloyd
1
Shiftclick para abrir un árbol y todos los subelementos también serían útiles.
TS
1
¿Cómo informarme de cuáles son las dependencias que faltan?
realtebo
2

http://www.amberfish.net/

ChkAsm le mostrará todas las dependencias de un ensamblado en particular a la vez, incluidas las versiones, y le permitirá buscar fácilmente ensamblados en la lista. Funciona mucho mejor para este propósito que ILSpy ( http://ilspy.net/ ), que es lo que solía usar para esta tarea.

mhenry1384
fuente
1
A partir de 2019, ese sitio parece ser una especie de blog de aspecto incompleto ...
McGuireV10
@ McGuireV10 Así es. Eso es lamentable. Y una búsqueda rápida de Google ya no da resultados para esa aplicación.
mhenry1384
0

Otro útil complemento de Reflector que utilizo es la Matriz de estructura de dependencia . Es realmente genial ver qué clases usan qué. Además, es gratis.

Richard Morgan
fuente
No muestra los números de versión, desafortunadamente, al menos la versión que se instala como un complemento de Visual Studio no lo hace.
mhenry1384
0

Intente compilar su ensamblado .NET con la opción --staticlink:"Namespace.Assembly". Esto obliga al compilador a extraer todas las dependencias en tiempo de compilación. Si encuentra una dependencia a la que no se hace referencia, dará una advertencia o un mensaje de error, generalmente con el nombre de ese ensamblado.

Namespace.Assemblyes el ensamblado que sospecha que tiene el problema de dependencia. Por lo general, solo vincular estáticamente este ensamblado hará referencia a todas las dependencias de manera transitiva.


fuente
-4

La mejor aplicación que veo y uso, muestra dlls perdidos / problemáticos: http://www.dependencywalker.com/

usuario1005462
fuente
2
Esta herramienta no ayudará con los ensamblados .NET.
Kevin Panko