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



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

690   12  

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

asmspy output screenshot

установите его быстро с Chocolatey:

choco install asmspy

откройте файл сборки в ILDASM и посмотрите @ the .сборка extern в манифесте

для просмотра .Зависимостей net код, вы можете использовать возможности инструмента вопросом, что происходит. Инструмент предлагает:

например, такой запрос может выглядеть так:

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()

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

www.netdepends.com

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

http://www.amberfish.net/

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

еще одна удобная надстройка отражателя, которую я использую, - это Матрица Структуры Зависимостей. Это действительно здорово, чтобы увидеть, какие классы использовать. Плюс это бесплатно.

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

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

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

Comments

    Ничего не найдено.