DLL 종속성을 확인하는 방법?


165

때로는 작은 프로젝트를 수행 할 때 충분히주의하지 않고 실수로 내가 알지 못하는 DLL에 대한 종속성을 추가합니다. 이 프로그램을 친구 나 다른 사람에게 배송 할 때 "일부 DLL"이 없기 때문에 "작동하지 않습니다". 물론 프로그램이 내 시스템에서 DLL을 찾을 수는 있지만 DLL은 찾을 수 없기 때문입니다.

DLL 종속성에 대한 실행 파일을 스캔하거나 "깨끗한"DLL이없는 환경에서 프로그램을 실행하여 이러한 oops 상황 을 방지하는 방법이 있습니까?


2
디버거는 출력 창에로드되는 모든 DLL을 표시합니다. 디버그 + Windows + 모듈에 해당 목록이 표시됩니다. 당신이 그들 모두를 설명 할 수 있는지 확인하십시오. 코드를 테스트하고 VM을 사용하는 것처럼 설치 관리자를 테스트하십시오.
한스 Passant

@Hans Passant : 표준 Windows DLL의 전체 목록을 찾을 수 있습니까?
orlp

c : \ windows \ system32에는 Microsoft 저작권이 있습니다.
한스 Passant

2
@orlp-시도해 볼 수도 있습니다 dumpbin /dependents <program>. %SYSTEM%또는에 모든 DLL을 나열하는 것보다 목록이 더 관련성이 있다고 생각합니다 %SYSTEM32%. MSDN의 DUMPBIN 옵션 도 참조하십시오 .
jww

답변:


104

Dependency Walker(2006의 마지막 업데이트) 또는이라고 불리는 현대적인 재 작성을 시도하십시오 Dependencies.


20
나는 이것이 현재 날짜가 있다는 것을 읽었으며 더 최신의 것이 있습니까?
TankorSmash

6
ddl 종속성이 OS 작업이어야하므로 가능하면 원래 OS 공급자 만 신뢰합니다. Microsoft 유틸리티 프로그램에서이 작업을 수행 할 수 있습니까? 커맨드 라인은 괜찮습니다.
Robin Hsu

3
@RobinHsu : DependencyWalker는 Visual Studio 2005까지 Visual Studio와 함께 제공되는 데 사용되었습니다. 최신 빌드는 Windows 드라이버 개발 키트에 포함되어 있으며 공식 웹 사이트에서는 제공되지 않습니다. 여전히 공식적으로 Microsoft 도구는 아니지만 Microsoft가 제재, 홍보 및 광고했습니다.
IInspectable


8
이제 C #에서 부분적으로 수행되는 오픈 소스 다시 쓰기가 있습니다. " Dependencies.exe ": github.com/lucasg/Dependencies를 충족 하십시오 . 테스트 노출 : 약간 베타 이지만 API 세트SxS를 분명히 처리 합니다 (Dependency Walker에서 누락).
Stein Åsmul

217

dumpbin Visual Studio 도구 (VC \ bin 폴더)에서 도움이 될 수 있습니다.

dumpbin /dependents your_dll_file.dll

7
편리한 작은 도구이며 이미 VS를 설치했을 때 새로운 것을 설치하지 않아도됩니다.
James

13
예, dumpbin.exe알아낼 매우 유용 /dependents하고 /imports. 다른 컴퓨터 link.exe와 함께 복사 하고 대상 컴퓨터 에서 해당 x86 Visual C ++ 런타임 재배포 가능 패키지 ( msvcr120.dllVisual Studio 2013 용) 를 사용할 수 있는지 확인 하면 다른 컴퓨터에서도 사용할 수 있습니다 . 일부 옵션에는 추가 종속성이 있습니다. 그건 그렇고, 그들은 옵션 이름을 망쳤습니다. /PREREQUISITES오히려 /DEPENDENTS라틴어를 공부해야했습니다.
Lumi

2
정말 훌륭합니다. 최종 실행 파일이 생성 될 때이를 빌드 단계에 검증 단계로 추가하여 배송에 포함되지 않은 것에 의존하지 않습니다.
Lothar

4
유일한 단점은이 편리한 도구가 매우 숨겨져 있다는 것입니다. c : \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkach

1
@rkachach Visual Studio 명령 줄 (도구-> Visual Studio 명령 프롬프트)을 열면 외부 명령으로 인식되며 "dumpbin"만 입력하면됩니다.
Bemipefe

45

나는 리눅스 팬들을위한 흥미로운 솔루션을 추천 할 수있다. 이 솔루션을 살펴본 후 DependencyWalker에서 이것으로 전환했습니다.

lddWindows 관련 exe,을 (를) 통해 즐겨 찾기 를 사용할 수 있습니다 dll.

이렇게하려면 Windows에 Cygwin (추가 패키지없이 기본 설치)을 설치 한 다음 시작하면 Cygwin Terminal됩니다. 이제 다음을 포함하여 좋아하는 Linux 명령을 실행할 수 있습니다.

$ ldd your_dll_file.dll

UPD : Windowsldd 에서 git bash 터미널을 통해서도 사용할 수 있습니다 . git이 이미 설치되어있는 경우 cygwin을 설치할 필요가 없습니다.


방금 cygwin을 설치하고 Linux 명령을 다시 찾아서 기뻤지 만 Cygwin 루트에서 나와 로컬 드라이브의 다른 파일에 액세스 할 수 없었습니다 (C :). 그게 정상인가요?
ThomasGuenet

1
나는 이것이 당신을 도울 수 있다고 생각합니다 : stackoverflow.com/questions/1850920/…
troyane

4
불행히도이 방법으로 찾을 수없는 일부 종속성이 있습니다 $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). 유틸리티 dumpbin은 모든 종속성을 올바르게 표시합니다.
fgiraldeau

5
Windows에서 GIT BASH 터미널을 통해 ldd를 사용하고 정상적으로 작동합니다. 따라서 자식이 있다면 cygwin을 설치할 필요가 없습니다. 예 : borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
이미 git bash를 설치 한 사람이 선호하는 솔루션이었습니다. 감사합니다!
Nicolas

28
  1. 작업하려는 어셈블리의 전체 파일 경로를 파악하십시오.

  2. 시작 버튼을 누르고 "dev"를 입력하십시오. "VS 2017 용 개발자 명령 프롬프트"라는 프로그램을 시작하십시오.

  3. 열린 창에서을 입력하십시오 dumpbin /dependents [path]. 여기서 [path]1 단계에서 알아 낸 경로는

  4. Enter 키를 누르십시오

Bam, 당신은 당신의 의존성 정보를 가지고 있습니다. 창은 다음과 같아야합니다.

여기에 이미지 설명을 입력하십시오

VS 2019 용 업데이트 : VS 설치에이 패키지가 필요합니다.여기에 이미지 설명을 입력하십시오


9
  1. "종속"이라는 프로그램이 있습니다
  2. cygwin이 설치되어 있으면 ldd file.exe보다 간단하지 않습니다.

4
이 도구를 Dependency Walker 라고합니다 . 실행 가능 이미지의 이름은 depend.exe 입니다.
IInspectable

7
Dependency Walker는 날짜가 있습니다. 마지막으로 2008 년에 지어졌습니다!
SuB

dependsAPI 세트를 지원하지 않으므로 Win7 +에는 쓸모가 없습니다.
ivan_pozdeev

8

가장 안전한 것은 프로그램을 테스트 할 수있는 깨끗한 가상 머신이 있다는 것입니다. 테스트하려는 모든 버전에서 VM을 초기 깨끗한 값으로 복원하십시오. 그런 다음 설정을 사용하여 프로그램을 설치하고 작동하는지 확인하십시오.

딜 문제는 얼굴이 다릅니다. Visual Studio를 사용하고 CRT에 동적으로 연결하는 경우 CRT DLL을 배포해야합니다. VS를 업데이트하면 다른 버전의 CRT를 배포해야합니다. 의존성을 확인하는 것만으로는 충분하지 않습니다. 깨끗한 기계에 전체 설치를하는 것이 유일한 안전한 솔루션 인 IMO입니다.

완전한 테스트 환경을 설정하지 않고 Windows 7을 사용하려는 경우 XP-Mode를 초기 클린 머신으로 사용하고 XP-More 를 사용하여 VM을 복제 할 수 있습니다.


6

개발 머신에서 프로그램을 실행하고 Sysinternals Process Explorer를 실행할 수 있습니다 . 아래쪽 창에는 여러 가지 이유로 편리한로드 된 DLL과 현재 경로가 표시됩니다. 배포 패키지를 실행하면 잘못된 경로에서 참조되는 DLL이 표시됩니다 (즉, 올바르게 패키지화되지 않음).

현재 우리 회사는 Visual Studio Installer 프로젝트를 사용하여 종속성 트리를 걷고 프로그램을 느슨한 파일로 출력합니다. VS2013에서는 이제 확장명이 https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d 입니다. 그런 다음이 느슨한 파일을보다 포괄적 인 설치 프로그램으로 패키지화하지만 적어도 해당 설정은 모든 닷넷 종속성을 투영하여 한 지점으로 드롭하고 누락 된 경우 경고합니다.


2

과거 (예 : WinXP 일)에는 DLL Dependency Walker (depends.exe)에 의존하거나 의존했지만, 여전히 DLL 문제를 확인할 수없는 경우가 있습니다. 이상적으로는 검사를 통해 런타임 전에 알아 내고 싶지만 문제가 해결되지 않거나 너무 많은 시간이 걸리는 경우 http://blogs.msdn.com/에 설명 된대로 "로더 스냅"을 활성화 할 수 있습니다. b / junfeng / archive / 2006 / 11 / 20 / debugging-loadlibrary-failures.aspxhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx 간단히 언급 한 LoadLibrary가 실패합니다. GetLastError 도움말 없음

경고 : 과거에 gflag가 무릎을 꿇고 기어 다니면서 Windows를 엉망으로 만들었습니다.

여기에 이미지 설명을 입력하십시오

참고 : "로더 스냅"은 프로세스 단위이므로 UI ​​활성화가 확인되지 않습니다 (cdb 또는 glfags -i 사용)


2

Jesse는 NDepend를 이미 언급했지만 (.NET 코드를 분석하는 경우) 어떻게 도움이 될 수 있는지 정확하게 설명 할 수 있습니다.

DLL 의존성에 대한 실행 파일을 스캔하거나 이러한 oops 상황을 방지하기 위해 "깨끗한"DLL이없는 환경에서 프로그램을 실행할 수있는 프로그램 / 스크립트가 있습니까?

NDepend 프로젝트 속성 패널에서 분석 할 응용 프로그램 어셈블리 (녹색)를 정의 할 수 있으며 NDepend는 응용 프로그램에서 사용하는 타사 어셈블리 (파란색)를 유추 합니다. 응용 프로그램 및 써드 파티 어셈블리를 검색 할 디렉토리 목록이 제공됩니다.

NDepend 프로젝트 속성 응용 프로그램 및 타사 어셈블리

이 디렉토리에 타사 어셈블리가 없으면 오류 모드가됩니다. 예를 들어 .NET Fx 디렉토리를 제거하면 .NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319타사 어셈블리가 해결되지 않았 음을 알 수 있습니다.

NDepend 프로젝트 속성 응용 프로그램 및 타사 어셈블리가 해결되지 않음

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


1

구글에서 "depends.exe"를 검색하십시오. 이것을 처리하는 작은 유틸리티입니다.


7
의존성 워커는 매우 오래된 것으로, 64 비트와 잘 맞지 않습니다. OP가 찾고있는 모든 종속 DLL을 확실하게 표시하지만 노이즈도 추가합니다 .64 비트 dll이 누락 된 32 비트 실행 파일이 있다는 것을 알 수 있습니다 ... 슬프게도 여전히 더 나은 것은 없습니다 대안.
eran

@eran 지금은 어떻습니까? 더 나은 대안이 있습니까? 감사.
Nikos

@ RestlessC0bra 내가 아는 바는 없지만 지난 5 년간 Windows 개발을 해 본 적이 없습니다. Dependency walker는 확실히 죽었고, Microsoft가이 유용한 도구를 업데이트하거나 소스를 열어 다른 사람들이 생존 할 수 있도록하는 것을 귀찮게하지 않는 것은 부끄러운 일입니다.
eran

1
@eran 아니오 DW는 죽지 않았습니다. 분명히 그것은 여전히 ​​광범위하게 사용됩니다. 다른 도구가 있지만 DW가 여전히 최고 일 것입니다.
Nikos

@ RestlessC0bra : 종속성 워커가 죽었습니다. 64 비트 모듈을 따라 잡지 않았습니다. 면밀히 살펴보면 Dependency Walker를 광범위하게 사용하면 스택 오버플로 질문이 발생하여 왜 발생하는지 묻습니다. 그러나 그런 일은 결코 일어나지 않습니다. 그것은 단지 부정적 부정적 / 긍정적입니다. 프로세스 모니터 가 선호하는 도구 여야합니다.
IInspectable

1

소스 코드가 있으면 ndepend를 사용할 수 있습니다.

http://www.ndepend.com/

그것은 비싸고 의존성을 분석하는 것보다 훨씬 더 많은 일을하므로 찾고있는 것에 너무 과도해질 수 있습니다.


3
.NET에 맞게 특별히 설계된 도구이므로 기본 이미지의 종속성도 분석합니까?
IInspectable

아마 아닐 것입니다, @IInspectable. .NET에는 P-Invoke를 사용하는 것을 제외하고는 그렇게 할 수있는 방법이 없다고 생각합니다.
kayleeFrye_onDeck

@kayleeFrye_onDeck : 가져 오기 테이블을 구문 분석하면 파일을 읽습니다. .NET은 파일을 읽을 수 있습니다.
IInspectable

네! 그러나이 작업을 수행하는 .NET API는 없습니다. (무엇을 제안합니까? 저는 실제로 .NET 프로그래머가 아니며 하위 수준 솔루션이 나오지 않을 때이를 사용하는 사람입니다. 점검 도구가 적당합니다. 거기에 있지만 Windows 용 배포가 쉽고 빠를뿐만 아니라 거의 사용되지 않습니다. 컴파일 할 때 사용 된 프레임 워크를 감지하기 위해 알 수없는 이진 파일을 재귀 적으로 검사하는 데 사용하려고했습니다. 따라서 특수 매개 변수로 처리 할 수 ​​있습니다. 내가 사용하는 것을보아야 할 수도 있습니다 LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck : Windows API에는 모듈의 가져 오기 테이블을 읽을 수있는 것이 없습니다. 파일을 읽고 내용을 구문 분석해야합니다. 네이티브 코드와 .NET은 차이가 없습니다. LoadLibraryEx거기에 도움이되지 않습니다.
IInspectable

0

pedeps 프로젝트 ( https://github.com/brechtsanders/pedeps )에는 .exe (또는 .dll) 파일과 해당 파일에 의존하는 모든 파일을 복사하기위한 명령 줄 도구 (copypedeps)가 있습니다. 응용 프로그램이 작동하는 시스템에서이 작업을 수행하는 경우 모든 의존성 DLL과 함께 제공 할 수 있어야합니다.



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