.NET DLL ссылки / утилита проверки зависимостей - PullRequest
20 голосов
/ 06 января 2012

В Visual Studio я могу видеть ссылки на dll в качестве прикрепленного изображения в качестве примера.С помощью этой справочной информации я могу открыть (из примера) проект Composition, чтобы найти все остальные ссылки и получить все имена файлов ссылок.

Есть ли утилита, которая выполняет эту работу автоматически?Я имею в виду, что при наличии сборки .NET она рекурсивно проверяет все ссылки / зависимости, чтобы дать имена DLL.

Я проверил ldd и Depends.exe в cygwin, но, похоже, они не показывают dll издругие проекты, но только системные dll.

enter image description here

Ответы [ 5 ]

25 голосов
/ 06 января 2012

Да: ildasm.exe .Он устанавливается вместе с SDK.

Должен быть в пути, например: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin

11 голосов
/ 03 марта 2016

Мне нравится использовать AsmSpy для этого типа проверки. Для загрузки есть один exe-файл, а затем я помещаю его в папку с инструментами для быстрого доступа. https://github.com/mikehadlow/AsmSpy

4 голосов
/ 11 ноября 2013

Вы можете использовать предоставленный ildasm.exe, или, если вы хотите что-то более мощное, вы можете попробовать:

Отражатель

Еще лучше попробуйте бесплатно :

dotPeek

Привет,

1 голос
/ 14 августа 2015

Этот код отлично справится с поиском всех ссылок. «temp» будет дампом всех отслеженных ссылок.

    private void PerformReferenceAnalysis()
    {
        StringBuilder builder = new StringBuilder();
        HashSet<string> loadedAssemblies = new HashSet<string>();
        PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies);
        string temp = builder.ToString();
    }

    private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies)
    {
        if (builder.Length > 0)
        {
            builder.AppendLine();
        }
        builder.Append(leadingWhitespace + assembly.FullName);
        System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies();
        foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies)
        {
            if (loadedAssemblies.Contains(assemblyName.Name))
            {
                continue;
            }
            loadedAssemblies.Add(assemblyName.Name);
            System.Reflection.Assembly nextAssembly;
            try
            {
                nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName);
            }
            catch (Exception)
            {
                try
                {
                    nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name);
                }
                catch (Exception)
                {
                    nextAssembly = null;
                }
            }
            if (nextAssembly != null)
            {
                PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies);
            }
        }
    }
1 голос
/ 06 января 2012

Я не знаю каких-либо инструментов, которые бы делали это автоматически для вас, но я могу наметить шаги, которые должен был бы выполнить любой инструмент (или вы).

Каждая сборка содержит манифест. В манифесте перечислены имена и версии всех других сборок, от которых зависит текущая сборка. В самом простом случае вам нужно будет следовать этому пути рекурсивно.

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

Методы разрешения ссылок на сборки включают поиск любых уже загруженных сборок, поиск в глобальном кэше сборок, поиск в каталоге приложения, перенаправление на основе файлов конфигурации приложения или политик издателя и другие. Google для статьи "Как среда выполнения находит сборки" в MSDN для более подробной информации. Кроме того, ваше приложение может зарегистрироваться, чтобы выполнить собственное эталонное разрешение, обработав событие System :: AppDomain :: AssemblyResolve.

...