web-dev-qa-db-fra.com

Découvrez les dépendances de toutes les DLL?

J'ai une collection de DLL (disons 20). Comment connaître toutes les DLL dont dépend un DLL (disons DLL A)?

39
Abhijeet

Si vous voulez dire par programme, utilisez Assembly.GetReferencedAssemblies .

Vous pouvez utiliser cela récursivement pour trouver tous les assemblys dont vous avez besoin. (Vous trouvez donc les dépendances de X, puis les dépendances des dépendances, etc.)

37
Jon Skeet

Puisque la question est étiquetée "C #", je suppose que vous parlez de dlls gérées (assemblys). Dans ce cas, dependencywalker n'est pas utile. Si vous voulez faire cela avec un programme, les bons sont dotPeek de JetBrians et Reflector de RedGate. Ou vous pouvez même utiliser l'inspecteur d'objets dans Visual Studio.

Cependant, le processus peut être long et fastidieux. J'écrirais un court programme C/script F # qui utilise Assembly.GetReferencedAssemblies, comme l'a mentionné Jon.

Si, au lieu de cela, vous souhaitez examiner les dépendances de DLL natives avec un programme (code C #), vous devez parcourir le fichier PE (le format de fichier MS dll et exe) et son IAT (import address table). Pas facile, mais pas impossible ...

Je voudrais commencer ici sur MSDN et ici pour comprendre les sections PE et utiliser une bibliothèque gérée pour la lire (il y en a beaucoup, dont certaines du projet Mono (je pense à Cecil , cela devrait aussi fonctionner avec les binaires natifs); j’avais utilisé jadis celui-ci du bon John Gough.

12
Lorenzo Dematté

Vous pouvez utiliser dependency walker http://www.dependencywalker.com pour le résoudre. Notez cependant la différence entre x32 et x64.

Dependency Walker est un utilitaire gratuit qui analyse tout fichier 32 bits ou 64 bits Module Windows (exe, dll, ocx, sys, etc.) et construit un hiérarchique diagramme en arbre de tous les modules dépendants.

7
Aniket Inge

Pour les assemblys .NET, un outil formidable pour afficher les assemblages dont dépend un assemblage est AsmSpy

5

Tous les crédits de réponse vont aux auteurs précédents pour l'utilisation de Assembly.GetReferencedAssemblies. Ceci est juste une application de console C # à écrire et oublier qui fonctionne uniquement pour les assemblys .NET. return 0 sur les assemblys que vous avez pu vérifier et, en cas de succès, les envoie à STDOUT. Tout le reste sera return 1 et imprimera une sorte de sortie d'erreur. Vous pouvez saisir le Gist ici .

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;
        }
    }
}

Usage: 

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

Sortie: 

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
5
kayleeFrye_onDeck

Si vous voulez que la DLL (les fichiers), Assembly.GetReferencedAssemblies renvoie également les assemblys .Net Framework.

Voici un extrait de code simple qui récupère les dll qu’il peut trouver dans le répertoire actuel (et qui inclut également d’autres fichiers connexes):

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();
}

Vous pouvez l'appeler comme suit: MessageBox.Show(string.Join("\r\n", GetDependentFiles(Assembly.GetEntryAssembly())));

0
Louis Somers