문제

.NET 응용 프로그램의 종속성을 어떻게 결정합니까? 하다 의존성 워커 관리되는 앱과 함께 작동 하시겠습니까? 나는 최신을 다운로드하고 앱을 프로파일 링하려고 시도했지만 많은 설명없이 종료했습니다. .NET에서 작동하지 않으면 런타임 DLL로드 문제를 디버깅하는 데 도움이되는 다른 도구가 있습니까?

도움이 되었습니까?

해결책

의존성 워커는 일반 Win32 바이너리에서 작동합니다. 모든 .NET DLL과 EXE는 작은 스터브 헤더 부분이있어 일반적인 바이너리처럼 보이지만 기본적으로 "CLR로드"입니다. 따라서 의존성 워커가 말할 수있는 전부입니다.

.NET 앱이 실제로 의존하는 것을 보려면 엄청나게 우수한 것을 사용할 수 있습니다. .NET 리플렉터 레드 게이트에서. (편집 : .NET Reflector는 이제 유료 제품입니다. Ilspy 무료 및 오픈 소스이며 매우 유사합니다.)

DLL을로드하고 마우스 오른쪽 버튼을 클릭하고 '분석'을 선택하십시오. 그런 다음 "Andupens"항목을 볼 수 있습니다.이 항목은 필요한 모든 DLL (및 해당 DLL 내부의 메소드)을 표시 할 수 있습니다.

앱이 X DLL에 의존하고 X DLL이 존재한다는 점에서 때때로 까다로울 수 있지만 런타임에로드하거나 위치 할 수는 없습니다.

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

다른 팁

나는 작은 유용성을 찾습니다 asmspy 로딩 어셈블리로 문제를 해결하기위한 귀중한 도구. 어셈블리 버전을 포함한 관리 조립품의 모든 어셈블리 참조를 나열합니다.

디렉토리의 명령 프롬프트로 실행하십시오. .dll 다음과 같은 논쟁으로 :

asmspy . all

asmspy output screenshot

초콜릿으로 빠르게 설치하십시오.

choco install asmspy

ildasm에서 어셈블리 파일을 열고 매니페스트에서 .assembly extern @ week @.

.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 dependencies browsing through C# LINQ query

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

NDepend Dependency Graph

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

NDepend Dependency Matrix

의존성 행렬은입니다 요금 그래프보다 직관적이지 않지만 복잡한 코드 섹션을 찾는 데 더 적합합니다.

NDepend Matrix vs Graph

면책 조항 : 나는 ndepend를 위해 일합니다

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

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

모노 툴체인을 사용하는 경우 사용할 수 있습니다. 그만큼 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

Asuble Assembly 바인딩 로깅 설정 HKLM Software Microsoft Fusion의 레지스트리 값 ENABLELOG 설정 1에 참고하십시오.

팁: 성능 페널티가 켜질 때 퓨전 로깅을 끄는 것을 잊지 마십시오.

비슷한 문제가 있었고 적합한 것을 찾지 못했고 좋은 오래된 의존성 워커를 알고 있었기 때문에 결국 나는 직접 썼습니다.

이것은 .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/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top