Как определить зависимости приложения .NET?

Как определить зависимости приложения .NET? Dependency Walker работает с управляемыми приложениями? Я загрузил последнюю и пробовал профилировать приложение, но он просто выходит без объяснения причин. Если это не работает с .NET, то есть ли другой инструмент, который поможет мне отладить проблему загрузки DLL во время выполнения?

Ответ 1

Подвижность зависателя работает с обычными двоичными файлами win32. Все .NET dll и exe имеют небольшую часть заголовка заглушки, которая делает их похожими на нормальные двоичные файлы, но все, что в основном говорит, это "загрузить CLR" - так, что все, что ходячий ходячий расскажет вам.

Чтобы узнать, на что на самом деле опирается ваше приложение .NET, вы можете использовать чрезвычайно отличный .NET рефлектор от Red Gate. (EDIT: Обратите внимание, что .NET Reflector теперь является платным продуктом. ILSpy является бесплатным и с открытым исходным кодом и очень похож.)

Загрузите в него свою DLL, щелкните правой кнопкой мыши и выберите "Анализ" - вы увидите элемент "Зависит", который покажет вам все остальные DLL (и методы внутри этих dll), которые ему нужны.

Иногда бывает сложно, потому что ваше приложение зависит от X dll и присутствует X dll, но по какой-либо причине невозможно загрузить или найти во время выполнения.

Чтобы устранить эти проблемы, у Microsoft есть Assembly Binding Log Viewer, который может показать вам, что происходит во время выполнения

Ответ 2

Откройте файл сборки в ILDASM и посмотрите @ex.partments в файле MANIFEST

Ответ 3

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

Запустите его в командной строке в каталоге .dll со следующими аргументами:

asmspy . all

asmspy output screenshot

Установите его быстро с помощью Chocolatey:

choco install asmspy

Ответ 4

Чтобы просмотреть зависимости кода .NET, вы можете использовать возможности инструмента NDepend. Инструмент предлагает:

Например, такой запрос может выглядеть так:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

И его результат выглядит следующим образом: (обратите внимание на метрику кода глубина, 1 для прямых абонентов, 2 для абонентов прямых абонентов...) (обратите внимание также на кнопку "Экспорт в граф", чтобы экспортировать результат запроса к Call Graph)

Просмотр зависимостей NDepend через С# LINQ query

График зависимости выглядит следующим образом:

NDepend Dependency Graph

Матрица зависимостей выглядит так:

Матрица зависимостей NDepend

Матрица зависимостей де-факто менее интуитивна, чем график, но она больше подходит для просмотра сложных разделов кода, например:

NDepend Matrix vs Graph

Отказ от ответственности: я работаю для NDepend

Ответ 5

Если вы используете инструментальную цепочку Mono, вы можете использовать утилиту monodis с аргументом --assemblyref для перечисления зависимостей Сборка .NET. Это будет работать как с файлами .exe, так и .dll.

Пример использования:

monodis --assemblyref somefile.exe

Пример вывода (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Пример вывода (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Ответ 6

Вам не нужно загружать и устанавливать условно-бесплатные приложения или инструменты. Вы можете сделать это с помощью .NET с помощью Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

Ответ 7

Включить ведение журнала привязки сборок задайте значение реестра EnableLog в HKLM\Software\Microsoft\Fusion для 1. Обратите внимание, что вам необходимо перезапустить приложение (используйте iisreset), чтобы изменения вступили в силу.

Совет. Не забудьте выключить ведение журнала фьюжн, когда вы закончите, так как есть ограничение производительности, чтобы оно было включено.

Ответ 8

http://www.amberfish.net/

ChkAsm покажет вам все зависимости конкретной сборки сразу, включая версии, и легко позволит вам искать сборки в списке. Для этой цели работает намного лучше, чем ILSpy (http://ilspy.net/), что я использовал для этой задачи.

Ответ 9

Смешно, что у меня была подобная проблема, и я не нашел ничего подходящего и знал о доброй старой Dependency Walker, поэтому, в конце концов, я написал ее сам.

Это относится к .NET конкретно и покажет, какие ссылки на сборку (и отсутствует) рекурсивно. Он также будет отображать зависимости от исходной библиотеки.

Это бесплатно (для личного использования) и доступно здесь для всех, кого это интересует: www.netdepends.com

www.netdepends.com

Обратная связь.

Ответ 10

Еще одна удобная надстройка Reflector, которую я использую, - это Матрица структуры зависимостей. Очень здорово видеть, какие классы используют то, что. Плюс это бесплатно.

Ответ 11

Попробуйте компилировать сборку .NET с опцией --staticlink:"Namespace.Assembly". Это заставляет компилятор задействовать все зависимости во время компиляции. Если он встречается с зависимостями, которые не ссылаются на него, сообщение об ошибке или ошибке обычно указывается с именем этой сборки.

Namespace.Assembly - это сборка, которая, как вы подозреваете, имеет проблему зависимости. Обычно просто статическая привязка этой сборки будет относиться ко всем зависимостям транзитивно.

Ответ 12

Лучшее приложение, которое я вижу и использую, показывает пропущенные/проблемные DLL: http://www.dependencywalker.com/