Как определить зависимости приложения .NET? Dependency Walker работает с управляемыми приложениями? Я загрузил последнюю и пробовал профилировать приложение, но он просто выходит без объяснения причин. Если это не работает с .NET, то есть ли другой инструмент, который поможет мне отладить проблему загрузки DLL во время выполнения?
Как определить зависимости приложения .NET?
Ответ 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
Установите его быстро с помощью Chocolatey:
choco install asmspy
Ответ 4
Чтобы просмотреть зависимости кода .NET, вы можете использовать возможности инструмента NDepend. Инструмент предлагает:
- a график зависимостей
- a матрица зависимостей,
- а также некоторые запросы С# LINQ могут быть отредактированы (или сгенерированы) для просмотра зависимостей.
Например, такой запрос может выглядеть так:
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
Ответ 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
ChkAsm покажет вам все зависимости конкретной сборки сразу, включая версии, и легко позволит вам искать сборки в списке. Для этой цели работает намного лучше, чем ILSpy (http://ilspy.net/), что я использовал для этой задачи.
Ответ 9
Смешно, что у меня была подобная проблема, и я не нашел ничего подходящего и знал о доброй старой Dependency Walker, поэтому, в конце концов, я написал ее сам.
Это относится к .NET конкретно и покажет, какие ссылки на сборку (и отсутствует) рекурсивно. Он также будет отображать зависимости от исходной библиотеки.
Это бесплатно (для личного использования) и доступно здесь для всех, кого это интересует: www.netdepends.com
Обратная связь.
Ответ 10
Еще одна удобная надстройка Reflector, которую я использую, - это Матрица структуры зависимостей. Очень здорово видеть, какие классы используют то, что. Плюс это бесплатно.
Ответ 11
Попробуйте компилировать сборку .NET с опцией --staticlink:"Namespace.Assembly"
. Это заставляет компилятор задействовать все зависимости во время компиляции. Если он встречается с зависимостями, которые не ссылаются на него, сообщение об ошибке или ошибке обычно указывается с именем этой сборки.
Namespace.Assembly
- это сборка, которая, как вы подозреваете, имеет проблему зависимости. Обычно просто статическая привязка этой сборки будет относиться ко всем зависимостям транзитивно.
Ответ 12
Лучшее приложение, которое я вижу и использую, показывает пропущенные/проблемные DLL: http://www.dependencywalker.com/