Как определить зависимости a.NET заявление?
Как определить зависимости приложения .NET? Делает Dependency Walker работы с управляемыми приложениями? Я загрузил последнюю версию и попытался профилировать приложение, но он просто выходит без особых объяснений. Если он не работает с .NET, то есть ли какой-то другой инструмент, который поможет мне отладить проблему загрузки DLL во время выполнения?
12 ответов:
Dependency walker работает на обычных win32 двоичных файлов. Все dll .NET и exe имеют небольшую часть заголовка заглушки, которая делает их похожими на обычные двоичные файлы, но все это в основном говорит о том, что "загрузите CLR" - так что это все, что вам скажет dependency walker.
чтобы увидеть, какие вещи ваше приложение .NET на самом деле полагается, вы можете использовать чрезвычайно отличный.NET reflector от Красных Ворот. (EDIT: обратите внимание, что .NET Reflector теперь является платным продуктом. ILSpy свободный и с открытым исходным кодом и очень похожие.)
загрузите DLL в него, щелкните правой кнопкой мыши и выберите "анализ" - вы увидите элемент "зависит от", который покажет вам все другие dll (и методы внутри этих dll), которые ему нужны.
иногда это может быть сложнее, хотя, в том, что ваше приложение зависит от X dll, и X dll присутствует, но по какой-либо причине не может быть загружен или расположен во время выполнения.
для устранения таких проблем у Microsoft есть Просмотр Журнала Привязки Сборки, который может показать вам, что происходит во время
Я нахожу небольшую утилиту AsmSpy бесценный инструмент для решения проблем с загрузкой сборок. В нем перечислены все ссылки на сборки управляемых сборок, включая версии сборок.
запустите его в командной строке в каталоге
.dllсо следующими аргументами:asmspy . allустановите его быстро с Chocolatey:
choco install asmspy
для просмотра .Зависимостей net код, вы можете использовать возможности инструмента вопросом, что происходит. Инструмент предлагает:
- a граф зависимостей
- a матрица зависимостей,
- а также запросы 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()
если вы используете моно toolchain, вы можете использовать the
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/), который является тем, что я использовал, чтобы использовать для этой задачи.
еще одна удобная надстройка отражателя, которую я использую, - это Матрица Структуры Зависимостей. Это действительно здорово, чтобы увидеть, какие классы использовать. Плюс это бесплатно.
попробуйте скомпилировать сборку .NET с опцией
--staticlink:"Namespace.Assembly". Это заставляет компилятор в зависимости во время компиляции. Если он столкнется с зависимостью, на которую нет ссылки, он выдаст предупреждение или сообщение об ошибке, обычно с именем этой сборки.
Namespace.Assembly- это сборка, которую вы подозреваете, как проблема зависимости. Обычно просто статическое связывание этой сборки будет ссылаться на все зависимости транзитивно.
Лучшее приложение, которое я вижу и использую, показывает пропущенные / проблемные DLL: http://www.dependencywalker.com/






Comments