Как определить зависимости приложения .NET?
-
03-07-2019 - |
Вопрос
Как определить зависимости приложения .NET?Делает Зависимость Уокер работать с управляемыми приложениями?Я скачал последнюю версию и попробовал профилировать приложение, но оно просто закрывается без особых объяснений.Если он не работает с .NET, есть ли какой-нибудь другой инструмент, который помог бы мне отладить проблему с загрузкой DLL во время выполнения?
Решение
Обходчик зависимостей работает на обычных двоичных файлах win32. Все .NET DLL и EXE имеют небольшую часть заглушки заглушки, которая делает их похожими на обычные двоичные файлы, но все, что они в основном говорят, это «загрузить CLR»; - вот и все, что вам скажет ходок с зависимостями.
Чтобы узнать, на что действительно опирается ваше приложение .NET, вы можете использовать потрясающе . Чистый отражатель от Red Gate. (РЕДАКТИРОВАТЬ. Обратите внимание, что .NET Reflector теперь является платным продуктом. ILSpy является бесплатным, открытым исходным кодом и очень похожим.) р>
Загрузите в него свою DLL, щелкните правой кнопкой мыши и выберите «Анализ», после чего вы увидите " Зависит от " элемент, который покажет вам все остальные библиотеки DLL (и методы внутри этих библиотек DLL), в которых он нуждается.
Иногда это может оказаться сложнее, поскольку ваше приложение зависит от X dll и X dll присутствует, но по какой-либо причине не может быть загружено или расположено во время выполнения.
Для устранения подобных проблем у Microsoft есть Сборка Binding Log Viewer , который может показать вам, что происходит во время выполнения
Другие советы
Я нахожу небольшую утилиту AsmSpy бесценным инструментом для решения проблем с загрузкой сборок. В нем перечислены все ссылки на сборки управляемых сборок, включая версии сборок.
Запустите его в командной строке в каталоге .dll
со следующими аргументами:
asmspy . all
Установите его быстро с помощью Chocolatey:
choco install asmspy
Откройте файл сборки в ILDASM и посмотрите @ .assembly extern в МАНИФЕСТЕ
Для просмотра зависимостей кода .NET можно использовать возможности инструмента NDepend.Инструмент предлагает:
- а граф зависимостей
- а матрица зависимостей,
- а также некоторые C# 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 — для вызывающих прямых абонентов...) (обратите внимание также на кнопку «Экспорт в график», позволяющую экспортировать результат запроса в График вызовов)
График зависимости выглядит так:
Матрица зависимостей выглядит так:
Матрица зависимостей де-факто менее интуитивно понятен, чем график, но он больше подходит для просмотра сложных участков кода, таких как:
Отказ от ответственности:Я работаю в NDepend
Вам не нужно загружать и устанавливать условно-бесплатные приложения или инструменты. Вы можете сделать это программно из .NET, используя <код> Assembly.GetReferencedAssemblies () код> р>
Assembly.LoadFile(@"app").GetReferencedAssemblies()
Если вы используете набор инструментов Mono, вы можете использовать < Утилита code> 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
Включите ведение журнала привязки сборки. Установите для параметра реестра EnableLog в HKLM \ Software \ Microsoft \ Fusion значение 1. Обратите внимание, что необходимо перезапустить приложение (использовать iisreset), чтобы изменения имели какой-либо эффект.
Совет. Не забудьте отключить ведение журнала Fusion, когда закончите, поскольку из-за этого снижается производительность.
Забавно, у меня была похожая проблема, и я не нашел ничего подходящего и знал о старой доброй Dependency Walker, поэтому в конце концов я написал ее сам.
Это относится конкретно к .NET и покажет, какие ссылки есть (и отсутствуют) в сборке рекурсивно. Это также покажет родные зависимости библиотеки.
Это бесплатно (для личного использования) и доступно здесь для всех, кто заинтересован: www.netdepends.com р>
Обратная связь приветствуется.
ChkAsm покажет вам все зависимости конкретной сборки одновременно, включая версии, и легко позволит вам искать сборки в списке. Для этой цели работает намного лучше, чем ILSpy ( http://ilspy.net/ ), который я использовал раньше для этой задачи.
Другой удобной надстройкой Reflector, которую я использую, является Матрица структуры зависимостей . Действительно здорово видеть, какие классы используют что. Плюс это бесплатно.
Попробуйте скомпилировать сборку .NET с параметром - staticlink: " Namespace.Assembly "
. Это заставляет компилятор извлекать все зависимости во время компиляции. Если он обнаружит зависимость, на которую нет ссылки, он выдаст предупреждение или сообщение об ошибке, обычно с названием этой сборки.
Namespace.Assembly
- это сборка, которая, как вы подозреваете, имеет проблему с зависимостями. Обычно просто статическое связывание этой сборки будет транзитивно ссылаться на все зависимости.
Лучшее приложение, которое я вижу и использую, показывает пропущенные / проблемные dll: http://www.dependencywalker.com/