Как программно получить зависимости от DLL

Сортировано по времени, ограничено jpg, ведущими нулями и базовым именем (в случае, если вы, скорее всего, захотите):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(все в одной строке, без \)

17
задан John Topley 10 March 2009 в 09:05
поделиться

4 ответа

Можно использовать функция EnumProcessModules. Управляемый API как предложенный kaanbardak не даст Вам список собственных модулей.

, Например, видят эта страница на MSDN

, Если необходимо статически проанализировать dll, необходимо вырыть в формат PE и узнать о таблицах импорта. Посмотрите этот превосходное учебное руководство для деталей.

11
ответ дан 30 November 2019 в 14:12
поделиться

ПРИМЕЧАНИЕ : На основе комментариев из сообщения ниже, я предполагаю, что это могло бы пропустить неуправляемые зависимости также, потому что оно полагается на отражение.

Вот маленькая c# программа, записанная Jon Skeet из bytes.com на зависимость Walker

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();
    }
}
от.NET
4
ответ дан 30 November 2019 в 14:12
поделиться

Для получения собственных зависимостей от модуля я полагаю, что должно быть нормально получать его из таблицы импорта файла PE, вот 2 ссылки, которые объясняют что всесторонний:

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

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

Для получения зависимостей от.NET мы можем использовать API.NET, как блок. Загрузка.

Для получения модуля.NET все зависимости Как насчет объединения эти 2 пути - блоки.NET являются просто файлом PE с метаданными.

1
ответ дан 30 November 2019 в 14:12
поделиться

Для чтения DLL (модули), загруженные выполнением exe, используйте функции ToolHelp32 Документация справки Инструмента относительно MSDN.

Не уверенный, что это покажет для .NET, работающего exe (я никогда не пробовал его). Но, это действительно показывает полный путь от того, где DLL был загружен. Часто, это было информацией, в которой я нуждался при попытке разобраться в проблемах DLL. .NET, как предполагается, устранил необходимость использовать эти функции (ищите Ад DLL для получения дополнительной информации).

-1
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: