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

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



답변

종속성 워커는 일반 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에는 런타임 에 무슨 일이 일어나고 있는지 보여줄 수 있는 어셈블리 바인딩 로그 뷰어 가 있습니다.


답변

작은 유틸리티 AsmSpy 는 어셈블리로드 문제를 해결하는 데 매우 중요한 도구입니다. 어셈블리 버전을 포함하여 관리되는 어셈블리의 모든 어셈블리 참조를 나열합니다.

의 디렉터리에있는 명령 프롬프트에서 .dll다음 인수를 사용하여 실행합니다 .

asmspy . all

asmspy 출력 스크린 샷

Chocolatey로 빠르게 설치하십시오.

choco install asmspy


답변

ILDASM에서 어셈블리 파일을 열고 MANIFEST에서 .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) (통지도 수출 그래프 버튼은에 쿼리 결과를 내 보냅니다 콜 그래프 )

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

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

NDepend 종속성 그래프

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

NDepend 종속성 매트릭스

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

NDepend 매트릭스와 그래프

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


답변

셰어웨어 앱이나 도구를 다운로드하고 설치할 필요가 없습니다. .NET에서 프로그래밍 방식으로 수행 할 수 있습니다.Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()


답변

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


답변

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

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