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


Answers

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

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

asmspy . all

Instalarlo rápidamente con Chocolatey:

choco install asmspy
Question

¿Cómo determino las dependencias de una aplicación .NET? ¿ Dependency Walker funciona con aplicaciones administradas? Descargué la última versión y probé la creación de perfiles de la aplicación, pero se acaba sin demasiada explicación. Si no funciona con .NET, ¿hay alguna otra herramienta que me ayude a depurar un problema de carga DLL en tiempo de ejecución?




Si está utilizando la herramienta de herramientas Mono, puede usar la utilidad monodis con el argumento --assemblyref para enumerar las dependencias de un ensamblado .NET. Esto funcionará en los archivos .exe y .dll .

Ejemplo de uso:

monodis --assemblyref somefile.exe

Ejemplo de salida (.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

Ejemplo de salida (.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



Para explorar dependencias de código .NET, puede usar las capacidades de la herramienta NDependen. La herramienta propone:

Por ejemplo, tal consulta puede verse así:

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 métrica del código, 1 es para personas que llaman directamente, 2 para llamadas de personas que llaman directamente ...) (observe también el botón Exportar a gráfico para exportar el resultado de la consulta a un gráfico de llamadas )

El gráfico de dependencia se ve así:

La matriz de dependencia se ve así:

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

Descargo de responsabilidad: trabajo para NDepend




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

Esto trata con .NET específicamente y mostrará qué referencias tiene (y falta) un ensamblaje recursivamente. También mostrará las dependencias de la biblioteca nativa.

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

Comentarios bienvenidos.