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


107

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

Ответы:


94

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

Чтобы увидеть, на что на самом деле опирается ваше .NET-приложение, вы можете использовать превосходный рефлектор .NET от Red Gate. (РЕДАКТИРОВАТЬ: обратите внимание, что .NET Reflector теперь является платным продуктом. ILSpy является бесплатным, с открытым исходным кодом и очень похож.)

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

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

Для устранения таких проблем у Microsoft есть средство просмотра журнала привязки сборок, которое может показать вам, что происходит во время выполнения.


Я думаю, вы немного пропустили этот URL - в текст ссылки был добавлен .aspx. Но мне удалось его найти.
Брайан Стюарт,

о ... да, контроль уценки съедает скобки в URL-адресах, и, к сожалению, MSDN помещает (VS80) во все свои URL-адреса :-(
Orion Edwards

44
Обратите внимание, что с начала 2011 года .NET Reflector больше не является бесплатным. Проект ILSpy с открытым исходным кодом очень похож.
yoyo

1
Просмотр журнала привязки сборки v4.0.30319.1 совершенно непригоден для использования. Записи журнала не отображаются в хронологическом порядке, и их нельзя отсортировать. Он отображает пути, которые не помещаются в средстве просмотра, и вы не можете изменить его размер. Это пустая трата времени.
Neutrino

dependencywalker.com Вы должны включать URL-адреса вещей, которые вы упоминаете, особенно. если они работают.
toddmo

54

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

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

asmspy . all

снимок экрана вывода asmspy

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

choco install asmspy

Может ли он работать с файлами C # или представлениями Razor? Я создаю подпроект путем экспорта некоторых представлений и контроллера из проекта mvc во время выполнения. И я хочу знать, какие зависимости требуются для этих представлений и контроллера, чтобы я мог копировать эти зависимости также во время выполнения, чтобы сделать подпроект публикуемым как отдельный веб-проект в IIS.
Rupendra

25

Откройте файл сборки в ILDASM и посмотрите @ .assembly extern в МАНИФЕСТЕ


1
Могу ли я таким образом увидеть версию зависимых сборок? Я вижу только имя зависимости, но не ее версию.
Michael R

На самом деле, да, я могу увидеть версию зависимых сборок и таким образом, нажав «МНОГИЕ T»
Майкл Р.

1
Я предпочитаю этот - не нужно загружать какие-либо дополнительные утилиты, если вы работаете в среде разработки
Дэн Филд

При отладке сбоя стороннего приложения, как установить только ildasm на клиента?
realtebo

18

Для просмотра зависимостей кода .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 для вызывающих прямых звонков ...) (обратите внимание также на кнопку Export to Graph для экспорта результата запроса в Call Graph )

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

График зависимости выглядит так:

График зависимостей NDepend

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

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

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

Матрица NDepend против графика

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


2
Патрику, наверное, следовало упомянуть, что он автор этого фантастического инструмента;). Это действительно стоит проверить. +1 за то, что написал!
Mitch Wheat

1
Эй, я сам это заметил. Мне нравится читать его сообщения в блоге - мне нужно попробовать NDepend!
Брайан Стюарт,

2
@MitchWheat - имя проверено, ха-ха, "Патрик из команды NDepend"
kayleeFrye_onDeck

Могу ли я использовать с VStudio? Отладка сбоев сторонних приложений не на моем компьютере
realtebo

16

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

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

9
Для отладки, это более удобно делать это с помощью PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Имеет приятное преимущество, заключающееся в том, что не нужно скачивать и не искать инструменты в неизвестных местах Windows. +1
jpmc26

3
поправьте меня, если я ошибаюсь, но это просто даст вам ту же ошибку, которую дает ваше приложение с отсутствующей зависимостью, поэтому не очень полезно
jk.

Это работает только тогда, когда сборка загружена в AppDomain. Сборки, загруженные для Reflection, возвращают нулевой набор.
Дэвид А. Грей

7

Если вы используете цепочку инструментов 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

5

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

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


5

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

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

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

www.netdepends.com

Обратная связь приветствуется.


Добавьте поддержку перетаскивания для открытия сборок. Также было бы неплохо, если бы было доступно развертывание XCOPY вместе с исходным кодом.
gigaplex

Я только что заметил, что на сайте нет явных ссылок на раздел, где есть две редакции, а бесплатная предназначена для некоммерческого использования. Я случайно наткнулся на это, найдя опцию «Обновить до Professional» в меню «Справка». На странице загрузки должно быть уведомление о том, что это не бесплатно для коммерческого использования.
gigaplex

@gigaplex Я приму к сведению обе эти благодарности, я посмотрю, что я могу сделать.
Ллойд

1
Shiftclick, чтобы открыть дерево, и все подпункты также будут полезны.
TS

1
Как сообщить мне, какие зависимости отсутствуют?
realtebo

2

http://www.amberfish.net/

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


1
По состоянию на 2019 год этот сайт выглядит неким схематичным блогом ...
McGuireV10,

@ McGuireV10 Так оно и есть. Это неудачно. И быстрый Google больше не обнаруживает совпадений для этого приложения.
mhenry1384

0

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


К сожалению, не показывает номера версий, по крайней мере, версия, которая устанавливается как надстройка Visual Studio, не показывает.
mhenry1384 09

0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.