Вопрос

Как определить зависимости приложения .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

 asmspy выходной скриншот

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

choco install asmspy

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

Для просмотра зависимостей кода .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 — для вызывающих прямых абонентов...) (обратите внимание также на кнопку «Экспорт в график», позволяющую экспортировать результат запроса в График вызовов)

NDepend dependencies browsing through C# LINQ query

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

NDepend Dependency Graph

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

NDepend Dependency Matrix

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

NDepend Matrix vs Graph

Отказ от ответственности:Я работаю в 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

 www.netdepends.com

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

http://www.amberfish.net/

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top