Як визначити залежності програми .NET?


106

Як визначити залежності програми .NET? Чи працює Walker залежностей із керованими додатками? Я завантажив останню версію і спробував профайлювати додаток, але він просто закінчується без особливих пояснень. Якщо він не працює з .NET, чи є якийсь інший інструмент, який допоможе мені налагодити проблему з завантаженням DLL під час роботи?

Відповіді:


94

Утримувач залежностей працює на звичайних бінарних файлах win32. У всіх .NET dll та exe є невелика частина заголовка заглушки, яка робить їх схожими на звичайні бінарні файли, але все, що в основному говорить, - це "завантажити CLR" - так це все, що ходити залежність скаже вам.

Щоб побачити, на що насправді покладається ваш додаток .NET, ви можете використовувати надзвичайно чудовий відбивач .NET від Red Gate. (EDIT: Зауважте, що .NET Reflector зараз є платним продуктом. ILSpy є безкоштовним та відкритим кодом та дуже подібним.)

Завантажте в нього DLL, клацніть правою кнопкою миші та оберіть "Аналіз" - тоді ви побачите пункт "Залежить від", який покаже вам всі інші 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 є абсолютно непридатним. Записи журналу не відображаються в хронологічному порядку, і ви не можете їх сортувати. Він відображає шляхи, які не вписуються в переглядач, і ви не можете змінити його розмір. Це повна трата часу.
Нейтрино

залежністьwalker.com Ви повинні включати URL-адреси речей, які ви згадуєте, esp. якщо вони працюють.
toddmo

54

Я вважаю невелику утиліту AsmSpy безцінним інструментом для вирішення проблем із завантаженнями. У ньому перераховані всі посилання на керовані збори, включаючи версії монтажу.

Запустіть його в командному рядку в каталозі .dllз наступними аргументами:

asmspy . all

скріншот виводу asmspy

Встановіть його швидко за допомогою Chocolatey:

choco install asmspy

Чи може це працювати і з файлами C #, або з видами Razor? Я створюю підпроект, експортуючи деякі представлення даних та контролер з проекту mvc під час виконання. І я хочу знати, які залежності вимагають ці Перегляди та контролер, щоб я могла скопіювати ці залежності також під час виконання, щоб зробити підпроект оприлюдненим як окремий веб-проект на IIS.
Рупендра

25

Відкрийте файл складання в ILDASM і подивіться @ .assembly зовнішній вигляд у MANIFEST


1
Чи можу я бачити і версію залежних збірок таким чином? Я бачу лише ім’я залежності, але також це не версія.
Майкл Р

Насправді, так, я також бачу версію залежних зборів і таким чином, натиснувши "MANIFES T"
Michael R

1
Я вважаю за краще цей - не потрібно завантажувати додаткові утиліти, якщо ви працюєте в середовищі розробників
Dan Field

Як налагоджувати аварію стороннього додатка, як встановити лише 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 - для прямих абонентів ...) (також зверніть увагу на кнопку Експортувати в графік, щоб експортувати результат запиту на графік викликів )

NDepend залежності переглядаючи C # LINQ запит

Графік залежності виглядає так:

NDepend графік залежності

Матриця залежності виглядає так:

NDepend матриця залежності

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

NDepend Matrix vs Graph

Відмова: Я працюю на NDepend


2
Патрік, мабуть, згадав, що він автор цього фантастичного інструменту;). Це дійсно варто перевірити. +1 для написання!
Мітч Пшеничний

1
Гей, я щойно це помітив сам. Мені подобається читати його публікації в блозі - мені доведеться спробувати NDepend!
Брайан Стюарт

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

Чи можу я використовувати з VStudio?
Налагоджувати

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. Асамблеї, завантажені для відображення, повертають нульовий набір.
Девід А. Грей

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

Смішно, що у мене був подібний випуск, і я не знайшов нічого підходящого, і знав про старого доброго ходака за залежність, тож врешті-решт я написав його сам.

Це стосується конкретно .NET і покаже, які посилання на збірку мають (і відсутні) рекурсивно. Він також покаже залежність від рідної бібліотеки.

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

www.netdepends.com

Відгуки Ласкаво просимо.


Будь ласка, додайте підтримку перетягування для відкриття збірок. Було б також непогано, якби було доступне розгортання XCOPY, а також вихідний код.
gigaplex

Щойно я помітив, що на веб-сайті немає явних посилань на розділ, де є два видання, а безкоштовне - для некомерційного використання. Я випадково натрапив на це, знайшовши в меню "Довідка" опцію "Оновити до професіонала". На сторінці завантаження повинно бути повідомлення про те, що це не безкоштовно для комерційного використання.
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, яку я використовую, - це матриця структури залежності . Дійсно чудово бачити, які класи використовують для чого. Плюс це безкоштовно.


Не показує номери версій, на жаль, принаймні версія, яка встановлюється як візуальна студія надбудова не має.
mhenry1384

0

Спробуйте скласти свою збірку .NET за допомогою параметра --staticlink:"Namespace.Assembly". Це змушує компілятора витягнути всі залежності за час компіляції. Якщо вона наштовхується на залежність, на яку не посилається, вона видаватиме попередження або повідомлення про помилку, як правило, з назвою цієї збірки.

Namespace.Assemblyце збірка, яку ви підозрюєте, що має проблему залежності. Зазвичай просто статичне з'єднання цієї збірки посилається на всі залежності перехідно.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.