¿Cómo puedo determinar las dependencias de a.NET aplicación?


¿Cómo puedo determinar las dependencias de una aplicación. NET? ¿Dependency Walker funciona con aplicaciones administradas? He descargado lo último y he intentado perfilar la aplicación, pero simplemente sale sin mucha explicación. Si no funciona con. NET, ¿hay alguna otra herramienta que me ayude a depurar un problema de carga de DLL en tiempo de ejecución?

Author: Colonel Panic, 2008-10-23

12 answers

Dependency walker funciona en binarios win32 normales. Todas las DLL y exe de. NET tienen una pequeña parte de encabezado de stub que las hace parecer binarios normales, pero todo lo que básicamente dice es "cargar el CLR", así que eso es todo lo que le dirá walker dependencia.

Para ver en qué cosas se basa realmente su aplicación.NET, puede usar el tremendamente excelente reflector. NET de Red Gate. (EDITAR: Tenga en cuenta que.NET Reflector es ahora un producto de pago. ILSpy es libre y 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 los métodos dentro de esas dll) que necesita.

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

Para solucionar este tipo de problemas, Microsoft tiene un Visor de Registro de Enlace de Ensamblado que puede mostrar lo que está pasando en tiempo de ejecución

 82
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-28 23:21:09

Encuentro la pequeña utilidad AsmSpy 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 .dll con los siguientes argumentos:

asmspy . all

captura de pantalla de salida asmspy

Instálalo rápidamente con Chocolatey:

choco install asmspy
 28
Author: Alexander van Trijffel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 12:33:37

Abra el archivo ensamblador en ILDASM y busque @ the.asamblea extern en el MANIFIESTO

 25
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-25 16:03:14

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

Por ejemplo, dicha consulta puede verse como:

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 como: (observe la métrica de código profundidad , 1 es para llamadores directos, 2 para llamadores de direct llama...) (observe también el botón Exportar a gráfico para exportar el resultado de la consulta a un gráfico de llamada )

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

El gráfico de dependencias se ve así:

Gráfico de Dependencias NDepend

La matriz de dependencias se ve así:

Matriz de Dependencias NDepend

La matriz de dependencias 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

 16
Author: Patrick from NDepend team,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-12 13:32:50

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

Assembly.LoadFile(@"app").GetReferencedAssemblies()
 10
Author: Colonel Panic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-23 11:29:03

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

Ejemplo de uso:

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
 7
Author: Alexander O'Mara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-08 05:25:18

Enable assembly binding logging establezca el valor de registro EnableLog en HKLM\Software\Microsoft\Fusion en 1. Tenga en cuenta que debe reiniciar la aplicación (usar iisreset) para que los cambios tengan algún efecto.

Consejo: Recuerde desactivar el registro de fusión cuando haya terminado, ya que hay una penalización de rendimiento para tenerlo activado.

 5
Author: Ramesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-23 00:45:22

Es gracioso que tuve un problema similar y no encontré nada adecuado y estaba al tanto de la buena dependencia de Walker, así que al final escribí uno yo mismo.

Esto trata con.NET específicamente y mostrará qué referencias tiene (y falta) un ensamblado recursivamente. También mostrará dependencias de bibliotecas nativas.

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

www.netdepends.com

Comentarios bienvenidos.

 4
Author: Lloyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-21 11:41:36

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.

 2
Author: mhenry1384,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-09 13:33:00

Otro complemento útil de Reflector que uso es la Matriz de Estructura de Dependencias . Es realmente genial ver qué clases usan qué. Además es gratis.

 0
Author: Richard Morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-13 13:09:48

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 se encuentra con una dependencia a la que no se hace referencia, dará una advertencia o un mensaje de error generalmente con el nombre de ese ensamblaje.

Namespace.Assembly es la asamblea que sospecha que tiene el problema de dependencia. Normalmente, simplemente vinculando estáticamente este ensamblaje hará referencia a todas las dependencias transitivamente.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-28 14:13:10

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

 -2
Author: user1005462,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 10:28:13