¿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?
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
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
Instálalo rápidamente con Chocolatey:
choco install asmspy
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
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:
- a gráfico de dependencias
- a matriz de dependencias ,
- y también algunas consultas de C# LINQ se pueden editar (o generar) para explorar dependencias.
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 )
El gráfico de dependencias se ve así:
La matriz de dependencias se ve así:
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:
Descargo de responsabilidad: Trabajo para NDepend
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()
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
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.
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
Comentarios bienvenidos.
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
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.
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.
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.
La mejor aplicación que veo y uso, mostrar archivos dll perdidos / problemáticos: http://www.dependencywalker.com /
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