DLL 의존성을 확인하는 방법
작은 프로젝트를 수행할 때 주의가 부족하여 실수로 인식하지 못하는 DLL에 종속성이 추가될 수 있습니다.이 프로그램을 친구나 다른 사람에게 보낼 때 "일부 DLL"이 없기 때문에 "작동하지 않습니다".이는 물론 프로그램이 시스템에서 DLL을 찾을 수 있지만 DLL에서는 찾을 수 없기 때문입니다.
이러한 ops 상황을 방지하기 위해 "깨끗한" DLL이 없는 환경에서 실행 파일을 스캔하거나 프로그램을 실행하여 테스트하는 방법이 있습니까?
dumpbin
Visual Studio ( VC \ bin ) 。
dumpbin /dependents your_dll_file.dll
Linux 팬들에게 흥미로운 솔루션을 추천할 수 있습니다.이 솔루션을 검토한 후 DependencyWalker에서 이 솔루션으로 전환했습니다.
Windows 관련 기능을 사용하여 즐겨찾기를 사용할 수 있습니다.exe
,dll
.
이를 수행하려면 Windows에 Cygwin(기본 설치, 추가 패키지 필요 없음)을 설치한 후 바로 시작해야 합니다.Cygwin Terminal
명령을 할 수 . 이제 다음과 같은 즐겨찾기 Linux 명령을 실행할 수 있습니다.
$ ldd your_dll_file.dll
UPD: 사용할 수 있습니다.ldd
또한 Windows의 git bash 터미널을 통해서도 가능합니다.git이 이미 설치되어 있는 경우에는 sygwin을 설치할 필요가 없습니다.
작업하려는 어셈블리의 전체 파일 경로를 확인합니다.
시작 버튼을 누르고 "dev"를 입력합니다."Developer Command Prompt for VS 2017" 프로그램을 실행합니다.
열리면 in in in in in in in라고 입력합니다.
dumpbin /dependents [path]
서, snowledge.[path]
입니다.Enter 키를 누르다
Bam, 의존관계 정보를 얻었군요.창은 다음과 같습니다.
VS 2019 업데이트: VS 설치 시 다음 패키지가 필요합니다.
Try Dependencies는 "오픈 소스 모던 Dependency Walker"로 설명되어 있습니다.
GUI가 있지만 명령줄에서 옵션인 JSON 출력도 사용할 수 있습니다.
mydll.dll의 의존관계를 1까지 재귀적으로 표시하려면 다음 절차를 수행합니다.
Dependencies.exe -chain mydll.dll -depth 1
출력 예:
□ mydll.dll (ROOT) : C:/.../mydll.dll
| □ USER32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\user32.dll
| □ ADVAPI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\advapi32.dll
| □ ole32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\ole32.dll
| □ GDI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\gdi32.dll
| □ CRYPT32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\CRYPT32.dll
| □ Secur32.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\Secur32.dll
| □ MSVCP140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\MSVCP140D.dll
| □ USP10.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\USP10.dll
| □ KERNEL32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\kernel32.dll
| □ VCRUNTIME140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\VCRUNTIME140D.dll
| □ ucrtbased.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\ucrtbased.dll
최대 의존관계 깊이가 깊은 경우 결과를 생성하는 데 오랜 시간이 걸릴 수 있습니다.
- "Depends"라는 프로그램이 있습니다.
- cygwin이 설치되어 있는 경우 ldd 파일보다 간단한 것은 없습니다.실행
가장 안전한 것은 프로그램을 테스트할 수 있는 클린 가상 시스템을 사용하는 것입니다.테스트할 모든 버전에서 VM을 초기 클린 값으로 복원합니다.그런 다음 설정을 사용하여 프로그램을 설치하고 프로그램이 작동하는지 확인합니다.
dll의 문제에는 다른 면이 있습니다.Visual Studio를 사용하여 CRT에 동적으로 링크하는 경우 CRT DLL을 배포해야 합니다.VS를 업데이트하면 다른 버전의 CRT를 배포해야 합니다.의존관계를 확인하는 것만으로는 불충분합니다.그것을 놓칠 수 있습니다.클린 머신에 풀 인스톨 하는 것만이 안전한 솔루션인 IMO입니다.
완전한 테스트 환경을 설정하지 않고 윈도우즈 7을 사용하려면 초기 클린 머신으로 XP-Mode를 사용하고 VM을 복제하려면 XP-More를 사용할 수 있습니다.
개발 기계에서 프로그램을 실행하고 Sysinternals 프로세스 탐색기를 실행할 수 있습니다.아래쪽 창에는 로드된 DLL과 DLL에 대한 현재 경로가 표시됩니다. 이 경로는 여러 가지 이유로 유용합니다.배포 패키지를 실행 중인 경우 잘못된 경로로 참조되는 DLL이 표시됩니다(예: 올바르게 패키지되지 않음).
현재 당사에서는 Visual Studio Installer 프로젝트를 사용하여 종속성 트리를 걷고 프로그램을 느슨한 파일로 출력합니다.VS2013에서는 https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d이 확장되었습니다.그런 다음 이러한 느슨한 파일을 보다 포괄적인 설치 프로그램으로 패키징합니다.그러나 적어도 셋업에서는 모든 닷넷 의존성을 투영하고 한 곳에 드롭하여 누락된 파일을 경고합니다.
NDepend는 Jesse에 의해 이미 언급되어 있습니다(분석하면).NET code)를 사용하고 있습니다만, 이 코드가 어떻게 도움이 되는지 정확하게 설명하겠습니다.
이러한 ops 상황을 방지하기 위해 "깨끗한" DLL이 없는 환경에서 실행 파일을 스캔하거나 프로그램을 실행할 수 있는 프로그램/스크립트가 있습니까?
NDepend Project Properties 패널에서 분석할 응용 프로그램어셈블리를 정의할 수 있습니다(녹색). NDepend는 응용 프로그램어셈블리가 사용하는 서드파티 어셈블리를 추론합니다(파란색).응용 프로그램 및 타사 어셈블리를 검색할 디렉터리 목록이 제공됩니다.
이러한 디렉토리에 서드파티제의 어셈블리가 없는 경우는, 에러 모드가 됩니다.를를들 、 를를했했경경 。 디렉토리 NET Fx " " "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
,알겠어.NET Fx 서드파티 어셈블리가 해결되지 않음:
면책사항:나는 NDepend에서 일한다.
과거(즉 WinXP일)에는 DLL Dependency Walker(depends.exe)에 의존/재활용하고 있었습니다만, 아직 DLL의 문제를 특정할 수 없는 경우가 있습니다.런타임 전에 검사를 통해 확인하는 것이 이상적이지만, 그래도 해결되지 않는 경우(또는 시간이 너무 오래 걸리는 경우) http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx 및 https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85)에 설명된 대로 "스냅"을 활성화해 볼 수 있습니다.aspx 및 간단히 언급된 LoadLibrary가 실패함, GetLastError 도움말 없음
경고: 과거에 gflag로 Windows를 엉망으로 만들어 무릎까지 기어오르게 한 적이 있습니다.여러분도 경고해 주셨습니다.
주의: "로더 스냅"은 프로세스별로 실행되므로 UI 활성화가 체크되지 않습니다(cdb 또는 glfags -i 사용).
아래 링크에서 Microsoft의 SysInternal 툴킷을 참조하십시오.https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer
다운로드 폴더를 열고 관리자 권한으로 "Procexp64.exe"를 엽니다.[검색 메뉴]-> [핸들 또는 DLL 검색]옵션 또는 Ctrl+F 숏컷 방법을 엽니다.
DLL은 "디버깅 모드"로 컴파일되어 전개되었습니까?
이 경우 DLL의 "D" 버전에 따라 다를 수 있습니다.예를 들어 다음과 같습니다.
MSVCP140D.dll
VCRUNTIME140D.dll
DLL이 "Release Mode"로 구축되어 있는 경우에는 종속되지 않습니다.D 버전에는 Microsoft Visual C++ Redistributable이 포함되어 있지 않습니다.
다른 사람들이 지적한 바와 같이, 이것이 사실인지 확인하기 위해:
Visual Studio에서:도구 -> Visual Studio 명령어프롬프트
명령 프롬프트에서 실행dumpbin /dependents
DLL에 대해서.
Windows에서 ".dependency" 의존관계 및 기타 유용한 정보를 보려면 CFF 탐색기(https://ntcore.com/?page_id=388)를 무료로 사용할 수 있으며 매우 유용합니다..dll 파일 및 기타 많은 함수의 "가져오기" 및 "내보내기" 종속성을 볼 수 있습니다.또한 GUI가 포함되어 있기 때문에 CLI를 사용할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/7378959/how-to-check-for-dll-dependency
'programing' 카테고리의 다른 글
WPF 응용 프로그램을 Administrator 모드로 강제 실행하는 방법 (0) | 2023.04.17 |
---|---|
PyWin32를 시작하려면 어떻게 해야 하나요? (0) | 2023.04.17 |
TableView용 NSIndexPath 작성 방법 (0) | 2023.04.17 |
SQL IN 절 매개 변수화 (0) | 2023.04.17 |
만약... 또는 만약...윈도 배치파일에서 (0) | 2023.04.17 |