Averiguar dependencias de todos los archivos DLL?


Tengo una colección de DLL(digamos 20). ¿Cómo puedo averiguar todas las DLL de las que depende una DLL específica (por ejemplo, DLL A)?

Author: kayleeFrye_onDeck, 2013-02-27

6 answers

Si quiere decir programáticamente, use Assembly.GetReferencedAssemblies.

Puede usar eso recursivamente para encontrar todos los ensamblados que necesita. (Así que encuentras las dependencias de X, luego las dependencias de las dependencias, etc.)

 37
Author: Jon Skeet,
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
2013-02-27 13:32:33

Dado que la pregunta está etiquetada como "C#", asumiría que está hablando de dll administrados (ensamblados). En ese caso, dependencywalker no es útil. Si quieres hacer eso con un programa, los buenos son dotPeek de JetBrians y Reflector de RedGate. O incluso puede usar el inspector de objetos en Visual Studio.

Sin embargo, puede ser un proceso largo y engorroso también. Escribiría un corto script C # program/ F # que usa Assembly.GetReferencedAssemblies, como mencionó Jon.

Si en cambio desea examinar dependencias DLLs nativas con un programa (código C#), debe examinar el archivo PE (el formato de archivo MS dll y exe) y su IAT (tabla de direcciones de importación). No es fácil, pero no imposible...

Comenzaría aquí en MSDN y aquí para entender las secciones PE, y usar una biblioteca administrada para leerlas (hay muchas, incluidas algunas del proyecto Mono (estoy pensando en Cecil, también debería funcionar con binarios nativos); en el pasado he utilizado este uno del buen John Gough.

 11
Author: Lorenzo Dematté,
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
2013-02-27 13:52:33

Puede usar dependency walker http://www.dependencywalker.com para resolver esto. Tome nota de la diferencia entre x32 y x64 sin embargo.

Dependency Walker es una utilidad gratuita que escanea cualquier 32-bit o 64-bit Módulo de Windows (exe, dll, ocx, sys, etc.) y construye una jerarquía diagrama de árbol de todos los módulos dependientes.

 6
Author: Aniket Inge,
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
2013-02-27 13:41:48

Para ensamblados.NET, una excelente herramienta para ver los ensamblados de los que depende un ensamblado es AsmSpy.

 5
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
2015-02-10 14:19:25

Todo el crédito de respuesta va a autores anteriores por el uso de Assembly.GetReferencedAssemblies. Esta es solo una aplicación de consola C # de escritura y olvido que funciona únicamente para ensamblados.NET. return 0 en los ensamblados que pudo comprobar, y cuando tuvo éxito, los envía a STDOUT. Todo lo demás será return 1 e imprimirá algún tipo de salida de error. Puedes agarrar la esencia aquí.

using System;
using System.Reflection;
using System.IO;
namespace DotNetInspectorGadget
{
    class DotNetInspectorGadget 
    {
        static int Main(string[] args) 
        {
          if(args.GetLength(0) < 1)
          {
            Console.WriteLine("Add a single parameter that is your" +
            " path to the file you want inspected.");
            return 1;
          }
          try {
                var assemblies = Assembly.LoadFile(@args[0]).GetReferencedAssemblies();

                if (assemblies.GetLength(0) > 0)
                {
                  foreach (var assembly in assemblies)
                  {
                    Console.WriteLine(assembly);
                  }
                  return 0;
                }
          }
          catch(Exception e) {
            Console.WriteLine("An exception occurred: {0}", e.Message);
            return 1;
          } finally{}

            return 1;
        }
    }
}

Uso:

call %cd%\dotnet_inspector_gadget.exe C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ConfigCI.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.ConfigCI.Commands.dll

Salida:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 4
Author: kayleeFrye_onDeck,
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-04-27 23:45:05

Si desea las DLL (los archivos), Assembly.GetReferencedAssemblies también devolverá los ensamblados de.Net Framework.

Aquí hay un fragmento de código simple que obtendrá las DLL que puede encontrar en el directorio actual (y también incluirá algunos otros archivos relacionados):

private readonly string[] _extensions = { ".dll", ".exe", ".pdb", ".dll.config", ".exe.config" };

private string[] GetDependentFiles(Assembly assembly)
{
    AssemblyName[] asm = assembly.GetReferencedAssemblies();
    List<string> paths = new List<string>(asm.Length);
    for (int t = asm.Length - 1; t >= 0; t--)
    {
        for (int e = _extensions.Length - 1; e >= 0; e--)
        {
            string path = Path.GetFullPath(asm[t].Name + _extensions[e]);
            if (File.Exists(path)) paths.Add(path);
        }
    }

    return paths.ToArray();
}

Puedes llamarlo así: MessageBox.Show(string.Join("\r\n", GetDependentFiles(Assembly.GetEntryAssembly())));

 0
Author: Louis Somers,
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
2018-04-18 13:24:58