.NET 응용 프로그램의 종속성을 확인하려면 어떻게합니까?


106

.NET 응용 프로그램의 종속성을 확인하려면 어떻게합니까? Dependency Walker 는 관리되는 앱에서 작동 합니까 ? 최신 버전을 다운로드하고 앱 프로파일 링을 시도했지만 별다른 설명없이 종료됩니다. .NET에서 작동하지 않는 경우 런타임 DLL로드 문제를 디버깅하는 데 도움이되는 다른 도구가 있습니까?

답변:


94

종속성 워커는 일반 win32 바이너리에서 작동합니다. 모든 .NET dll과 exe는 일반 바이너리처럼 보이게하는 작은 스텁 헤더 부분을 가지고 있지만 기본적으로 "load the CLR"이라고 말하는 것입니다. 따라서 종속성 워커가 알려줄 모든 것입니다.

.NET 앱이 실제로 어떤 것에 의존하는지 확인하려면 Red Gate 의 엄청나게 뛰어난 .NET 리플렉터 를 사용할 수 있습니다 . (편집 : .NET Reflector는 이제 유료 제품입니다. ILSpy 는 무료이며 오픈 소스이며 매우 유사합니다.)

DLL을로드하고 마우스 오른쪽 버튼을 클릭 한 다음 'Analyze'를 선택합니다. 그러면 필요한 다른 모든 dll (및 해당 dll 내부의 메서드)을 보여주는 "Depends On"항목이 표시됩니다.

앱이 X dll에 의존하고 X dll이 존재하지만 어떤 이유로 든 런타임에로드하거나 찾을 수 없다는 점에서 때때로 까다로울 수 있습니다.

이러한 종류의 문제를 해결하기 위해 Microsoft에는 런타임 에 무슨 일이 일어나고 있는지 보여줄 수 있는 어셈블리 바인딩 로그 뷰어 가 있습니다.


나는 당신이 그 URL을 조금 놓쳤다 고 생각합니다-.aspx가 링크 텍스트에 넣어졌습니다. 그래도 찾을 수있었습니다.
Brian Stewart

URL의에서 오 ... 그래 인하 제어 먹는다 브래킷, 그리고 모두 불행하게도 MSDN 둔다 (VS80) 그것의 URL의 :-(
오리온 에드워즈

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에서 어셈블리 파일을 열고 MANIFEST에서 .assembly extern을 찾습니다.


1
이 방법으로 종속 어셈블리의 버전도 볼 수 있습니까? 버전도 아닌 종속성 이름 만 표시됩니다.
Michael R

사실, 그렇습니다. "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) (통지도 수출 그래프 버튼은에 쿼리 결과를 내 보냅니다 콜 그래프 )

C # LINQ 쿼리를 통한 NDepend 종속성 검색

종속성 그래프는 다음과 같습니다.

NDepend 종속성 그래프

종속성 매트릭스는 다음과 같습니다.

NDepend 종속성 매트릭스

종속성 매트릭스는 사실상 그래프보다 덜 직관적이지만 다음과 같은 복잡한 코드 섹션을 탐색하는 데 더 적합합니다.

NDepend 매트릭스와 그래프

면책 조항 : 저는 NDepend에서 일합니다


2
Patrick은 아마도 그가 그 환상적인 도구의 저자라고 언급했을 것입니다.). 체크 아웃 할 가치가 있습니다. 쓰기 +1!
Mitch Wheat

1
이봐, 나도 이걸 알아 차렸어. 나는 그의 블로그 게시물을 읽는 것을 좋아합니다-NDepend를 시험 해봐야합니다!
Brian Stewart

2
@MitchWheat - 이름 체크 아웃 하하, "패트릭 NDepend 팀"
kayleeFrye_onDeck

VStudio와 함께 사용할 수 있습니까? 디버깅하려면 응용 프로그램은 나의 PC에서 타사 응용 프로그램의 충돌
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을 위해로드 된 어셈블리는 null 집합을 반환합니다.
데이비드 A. 그레이

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

어셈블리 바인딩 로깅 활성화는 HKLM \ Software \ Microsoft \ Fusion의 레지스트리 값 EnableLog를 1로 설정합니다. 변경 사항을 적용하려면 응용 프로그램을 다시 시작해야합니다 (iisreset 사용).

팁 : 퓨전 로깅을 설정하면 성능이 저하되므로 작업이 끝나면 퓨전 로깅을 해제해야합니다.


5

나는 비슷한 문제가 있었고 적절한 것을 찾지 못했고 좋은 오래된 Dependency Walker를 알고 있었기 때문에 결국 내가 직접 작성했습니다.

이것은 .NET을 구체적으로 다루며 어셈블리에 재귀 적으로 포함되거나 누락 된 참조를 보여줍니다. 네이티브 라이브러리 종속성도 표시됩니다.

무료 (개인용)이며 여기에서 관심있는 모든 사람이 사용할 수 있습니다. www.netdepends.com

www.netdepends.com

피드백을 환영합니다.


어셈블리 열기에 대한 끌어서 놓기 지원을 추가하십시오. 소스 코드와 함께 XCOPY 배포가 가능하면 좋을 것입니다.
gigaplex

웹 사이트에 두 가지 버전이있는 섹션에 대한 명확한 링크가없고 무료 버전은 비상업적 용도로 사용된다는 사실을 알았습니다. 도움말 메뉴에서 "전문가로 업그레이드"옵션을 찾아 실수로이 문제를 발견했습니다. 다운로드 페이지에 상업적 용도로 무료가 아니라는 알림이 있어야합니다.
gigaplex

@gigaplex이 두 가지 감사를 모두 적어두고 무엇을 할 수 있는지 살펴 보겠습니다.
Lloyd

1
Shift를 클릭하여 트리와 모든 하위 항목을 여는 것도 유용합니다.
TS

1
누락 된 종속성이 무엇인지 어떻게 알려주나요?
realtebo

2

http://www.amberfish.net/

ChkAsm은 버전을 포함하여 특정 어셈블리의 모든 종속성을 한 번에 표시하고 목록에서 어셈블리를 쉽게 검색 할 수 있도록합니다. 이 작업에 사용했던 ILSpy ( http://ilspy.net/ ) 보다이 목적을 위해 훨씬 더 잘 작동 합니다.


1
2019 년 현재 그 사이트는 일종의 스케치처럼 보이는 블로그로 보입니다 ...
McGuireV10

@ McGuireV10 그래서 그렇습니다. 운이 없었어. 그리고 빠른 Google은 더 이상 해당 앱에 대한 히트를 표시하지 않습니다.
mhenry1384

0

제가 사용하는 또 다른 편리한 Reflector 애드 인은 Dependency Structure Matrix 입니다. 어떤 클래스가 무엇을 사용하는지 보는 것은 정말 좋습니다. 게다가 무료입니다.


불행히도 적어도 Visual Studio 추가 기능으로 설치되는 버전은 표시되지 않습니다.
mhenry1384

0

옵션을 사용하여 .NET 어셈블리를 컴파일 해보십시오 --staticlink:"Namespace.Assembly". 이렇게하면 컴파일러가 컴파일 타임에 모든 종속성을 가져옵니다. 참조되지 않은 종속성이 발견되면 일반적으로 해당 어셈블리의 이름과 함께 경고 또는 오류 메시지가 표시됩니다.

Namespace.Assembly종속성 문제가있는 것으로 의심되는 어셈블리입니다. 일반적으로이 어셈블리를 정적으로 연결하면 모든 종속성이 전 이적으로 참조됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.