.NET 응용 프로그램의 종속성을 확인하려면 어떻게합니까? Dependency Walker 는 관리되는 앱에서 작동 합니까 ? 최신 버전을 다운로드하고 앱 프로파일 링을 시도했지만 별다른 설명없이 종료됩니다. .NET에서 작동하지 않는 경우 런타임 DLL로드 문제를 디버깅하는 데 도움이되는 다른 도구가 있습니까?
.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
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) (통지도 수출 그래프 버튼은에 쿼리 결과를 내 보냅니다 콜 그래프 )
종속성 그래프는 다음과 같습니다.
종속성 매트릭스는 다음과 같습니다.
종속성 매트릭스는 사실상 그래프보다 덜 직관적이지만 다음과 같은 복잡한 코드 섹션을 탐색하는 데 더 적합합니다.
면책 조항 : 저는 NDepend에서 일합니다
셰어웨어 앱이나 도구를 다운로드하고 설치할 필요가 없습니다. .NET에서 프로그래밍 방식으로 수행 할 수 있습니다.Assembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
[Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()
. 도구를 찾기 위해 모호한 Windows 위치를 다운로드하거나 사냥하지 않는 장점이 있습니다. +1
Mono 도구 모음을 사용 하는monodis
경우 --assemblyref
인수 와 함께 유틸리티 를 사용 하여 .NET 어셈블리의 종속성을 나열 할 수 있습니다 . 이것은 .exe
및 .dll
파일 모두에서 작동 합니다.
monodis --assemblyref somefile.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
$ 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
나는 비슷한 문제가 있었고 적절한 것을 찾지 못했고 좋은 오래된 Dependency Walker를 알고 있었기 때문에 결국 내가 직접 작성했습니다.
이것은 .NET을 구체적으로 다루며 어셈블리에 재귀 적으로 포함되거나 누락 된 참조를 보여줍니다. 네이티브 라이브러리 종속성도 표시됩니다.
무료 (개인용)이며 여기에서 관심있는 모든 사람이 사용할 수 있습니다. www.netdepends.com
피드백을 환영합니다.
ChkAsm은 버전을 포함하여 특정 어셈블리의 모든 종속성을 한 번에 표시하고 목록에서 어셈블리를 쉽게 검색 할 수 있도록합니다. 이 작업에 사용했던 ILSpy ( http://ilspy.net/ ) 보다이 목적을 위해 훨씬 더 잘 작동 합니다.
제가 사용하는 또 다른 편리한 Reflector 애드 인은 Dependency Structure Matrix 입니다. 어떤 클래스가 무엇을 사용하는지 보는 것은 정말 좋습니다. 게다가 무료입니다.
옵션을 사용하여 .NET 어셈블리를 컴파일 해보십시오 --staticlink:"Namespace.Assembly"
. 이렇게하면 컴파일러가 컴파일 타임에 모든 종속성을 가져옵니다. 참조되지 않은 종속성이 발견되면 일반적으로 해당 어셈블리의 이름과 함께 경고 또는 오류 메시지가 표시됩니다.
Namespace.Assembly
종속성 문제가있는 것으로 의심되는 어셈블리입니다. 일반적으로이 어셈블리를 정적으로 연결하면 모든 종속성이 전 이적으로 참조됩니다.
내가보고 사용하는 최고의 앱, 누락 / 문제가있는 dll 표시 : http://www.dependencywalker.com/