Ссылки на .NET DLL/утилита проверки зависимостей

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

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

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

enter image description here

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Reflector

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

dotPeek

Привет,

Ответ 4

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

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

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

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

Ответ 5

Этот код выполнит довольно хорошую работу по поиску всех ссылок. "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);
            }
        }
    }