19

特定のDLLまたはEXEファイルのすべてのDLL依存関係のリストを取得するにはどうすればよいですか?

つまり、「依存関係ウォーカー」ツールと同じようにプログラムで実行したいと思います。

そのためのWindows(理想的には.NET)APIとは何ですか?

4

6 に答える 6

13

EnumProcessModules関数を使用できます。kaanbardak のようなマネージド API は、ネイティブ モジュールのリストを提供しません。

たとえば、MSDN のこのページを参照してください

dll を静的に分析する必要がある場合は、 PE 形式を掘り下げ、インポート テーブルについて学ぶ必要があります。詳細については、この優れたチュートリアルを参照してください。

于 2009-01-16T10:52:20.097 に答える
4

:以下の投稿のコメントに基づいて、リフレクションに依存しているため、管理されていない依存関係も見逃される可能性があると思います。

これは、bytes.com の Jon Skeet が.NET Dependency Walkerで作成した小さな c# プログラムです。

using System;
using System.Reflection;
using System.Collections;

public class DependencyReporter
{
    static void Main(string[] args)
    {
        //change this line if you only need to run the code one:
        string dllToCheck = @"";

        try
        {
            if (args.Length == 0)
            {
                if (!String.IsNullOrEmpty(dllToCheck))
                {
                    args = new string[] { dllToCheck };
                }
                else
                {
                    Console.WriteLine
                        ("Usage: DependencyReporter <assembly1> [assembly2 ...]");
                }
            }

            Hashtable alreadyLoaded = new Hashtable();
            foreach (string name in args)
            {
                Assembly assm = Assembly.LoadFrom(name);
                DumpAssembly(assm, alreadyLoaded, 0);
            }
        }
        catch (Exception e)
        {
            DumpError(e);
        }

        Console.WriteLine("\nPress any key to continue...");
        Console.ReadKey();
    }

    static void DumpAssembly(Assembly assm, Hashtable alreadyLoaded, int indent)
    {
        Console.Write(new String(' ', indent));
        AssemblyName fqn = assm.GetName();
        if (alreadyLoaded.Contains(fqn.FullName))
        {
            Console.WriteLine("[{0}:{1}]", fqn.Name, fqn.Version);
            return;
        }
        alreadyLoaded[fqn.FullName] = fqn.FullName;
        Console.WriteLine(fqn.Name + ":" + fqn.Version);

        foreach (AssemblyName name in assm.GetReferencedAssemblies())
        {
            try
            {
                Assembly referenced = Assembly.Load(name);
                DumpAssembly(referenced, alreadyLoaded, indent + 2);
            }
            catch (Exception e)
            {
                DumpError(e);
            }
        }
    }

    static void DumpError(Exception e)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Error: {0}", e.Message);
        Console.WriteLine();
        Console.ResetColor();
    }
}
于 2009-01-16T13:45:00.977 に答える
1

この質問にはすでに回答が受け入れられていますが、壊れていない他の回答で参照されているドキュメントは古いものです。Win32 と x64 の違い、またはその他の違いをカバーしていないことを確認するためだけにすべてを読むのではなく、私のアプローチは次のとおりです。

C:\UnxUtils\usr\local\wbin>strings.exe E:\the-directory-I-wanted-the-info-from\*.dll > E:\TEMP\dll_strings.txt

これにより、Notepad++ や gvim などを使用して、DLL 名の末尾に 120.dll が付いた MS DLL に依存している DLL を検索できるようになり、更新が必要な DLL を見つけることができました。

これは、お気に入りの言語で簡単にスクリプト化できます。

この情報の検索は VS 2015 を念頭に置いており、この質問が Google 検索のトップの結果だったことを考えると、同じものを探している他の誰かに役立つかもしれないというこの回答を提供します。

于 2016-02-05T23:01:11.760 に答える
1

ネイティブ モジュールの依存関係を取得するには、PE ファイルのインポート テーブルから取得しても問題ないと思います。詳細を説明する 2 つのリンクを次に示します。

http://msdn.microsoft.com/en-us/magazine/bb985992.aspx

http://msdn.microsoft.com/en-us/magazine/cc301808.aspx

.NET の依存関係を取得するには、Assembly.Load などの .NET の API を使用できます。

.NET モジュールのすべての依存関係を取得するには、2 つの方法を組み合わせてみてください。.NET アセンブリは、メタ データを含む単なる PE ファイルです。

于 2009-03-10T08:32:38.177 に答える
0

実行中のexeによってロードされたDLL(モジュール)を読み取るには、 MSDNのToolHelp32関数Toolhelpドキュメントを使用します。

.Netを実行しているexeファイルで何が表示されるかわかりません(試したことはありません)。ただし、DLLがロードされた場所からのフルパスは表示されます。多くの場合、これはDLLの問題を解決しようとするときに必要な情報でした。.Netは、これらの関数を使用する必要をなくしたはずです(詳細については、DLL Hellを参照してください)。

于 2009-03-10T09:44:34.650 に答える