
Dependencies 命令行排查指南一条命令看清 Windows DLL 依赖全貌【免费下载链接】DependenciesA rewrite of the old legacy software depends.exe in C# for Windows devs to troubleshoot dll load dependencies issues.项目地址: https://gitcode.com/gh_mirrors/de/Dependencies构建机上弹出找不到 xxx.dll本地却运行正常文件明明就在目录里系统偏偏加载了另一份同名的旧版本。这类 DLL 加载问题光看报错文字很难定位根因——到底是文件缺失、被同名文件抢先还是被 ApiSet 机制悄悄重定向Dependencies 命令行版Dependencies.exe可以把这个问题变成一次脚本操作一条命令展开完整依赖树逐个节点标出系统是怎么找到或没找到每个模块的。工具定位depends.exe 的 C# 重写版它是早年随 Windows SDK 分发、2006 年前后停止更新的 Dependency Walkerdepends.exe的现代开源重写GUI 与 CLI 共用同一套解析引擎。相比老工具理解 Windows 8.1 的 ApiSet 重定向x86/x64 混合环境不再误判支持-json结构化输出CI 脚本可以直接消费可选-cache二进制缓存读取时先复制一份避免目标 DLL 被文件锁卡住。获取二进制并跑通第一条命令到 Releases 页面下载压缩包解压里面有两个可执行文件CLI 用的Dependencies.exe和图形界面的DependenciesGui.exe互不依赖。想自己构建也可以打开 Dependencies.sln注意手动选定Release配置与x64平台默认值未必是你要的双平台的构建流程可参考 appveyor.yml构建后的自动化验证脚本是 Deploy-Dependencies.ps1。首次运行敲Dependencies.exe -help即可不带参数同样打印帮助全部参数一览无余。⚠️ 受 /clr 编译限制机器上需要先装好 Visual C Redistributable发布包未签名SmartScreen 弹警告属于正常现象直接放行即可。用 -chain 展开依赖树定位失踪的 DLL场景某程序启动即崩错误指向一个 DLL。第一步Dependencies.exe -chain MyApp.exe输出是一棵递归树每个节点后面括号里的词是模块搜索策略——模拟 NT Loader 顺序找到的位置SxS、ApiSetSchema、WellKnownDlls、System32Folder、Environment、Fullpath等完整枚举见 DependenciesLib/FindPeModule.cs。带着路径的节点就是实际命中的文件整棵树里唯一要抓的信号是NOT_FOUND缺哪个 DLL 一目了然。加载了同名旧 DLL的问题也在这里现形对比括号里的策略和你以为的来源就能判断它到底从哪个目录被抢先命中。树太深时用-depth N限制递归默认无限只要一份已解析模块的扁平清单、不关心树结构换-modules即可。用 -imports 与 -exports 做函数级核对场景依赖全部解析成功运行却报解析失败。这通常是函数级问题Dependencies.exe -imports MyApp.exe Dependencies.exe -exports kernel32.dll-imports的输出按模块分组列出每个导入项。两种信号要留意按Ordinal_xxx序数导入的项没有函数名排查时信息量更差标注(Delay Import)的项表示对应 DLL 运行时才加载这类延迟炸雷是高频坑点。-exports列出每个导出的名称、序数与虚拟地址转发导出ForwardedName也会显示。查 .NET 目标还有-assemblyrefs程序集引用并尝试本地解析出版本和-modulerefs模块引用。清单与 SxS 问题则用-manifest转储内嵌 XML、-sxsentries查看 SxS 依赖项未找到的条目路径会显示???解析逻辑在 DependenciesLib/SxsManifest.cs。依赖链里出现api-ms-win-*.dll这类虚拟名时用-apisets转储系统 ApiSet 重定向表或-apisetsdll FILE直接从 apisetschema 文件读取仓库 test 目录下有 v2/v4/v6 三份素材再用-knowndll对照 KnownDlls 白名单解释为什么加载的是 System32 里那个同名 DLL。JSON 输出接进 CIdiff、断言与归档除-modules外其余命令都能加-json得到缩进 JSON序列化实现在 Dependencies/Program.csDependencies.exe -json -chain MyApp.exe deps.json⚠️ 注意-modules配合-json会被直接拒绝工具会提示 Json output is not currently supported脚本里请改用-chain。三个可落地的用法依赖变更检测每次构建导出快照与基线 diff依赖集合悄悄变化立刻可见。缺失断言扫描 JSON 中SearchStrategy为NOT_FOUND的节点有则让构建失败。报告归档把deps.json当构建产物存档事后追溯有据可查。PowerShell 里不用装额外工具$deps Dependencies.exe -json -chain MyApp.exe | ConvertFrom-Json $missing $deps.Dependencies | Where-Object { $_.SearchStrategy -eq NOT_FOUND } if ($missing) { $missing; throw 存在未解析的依赖 }Linux 侧也可以用jq消费同样的 JSON。参数速查表参数需要 FILEJSON一句话说明-chain是✅转储完整依赖链递归树-modules是❌已解析模块的扁平清单-imports是✅转储导入表函数级-exports是✅转储导出表函数级-assemblyrefs是✅.NET 程序集引用含本地版本解析-modulerefs是✅.NET 模块引用-manifest是✅转储内嵌 SxS 清单-sxsentries是✅转储 SxS 依赖项-apisetsdll是✅从 apisetschema 文件转储 ApiSet 表-knowndll否✅列出 x86/x64 KnownDlls 白名单-apisets否✅转储系统 ApiSet 重定向表-json/-cache——输出与缓存类全局开关-depth N/-help——限制递归深度 / 打印帮助-cache与-depth可以和上述任意转储命令自由组合。交互式排查、看图标和界面过滤去DependenciesGui.exe把依赖分析写进 CI、做回归断言就用Dependencies.exe。它只覆盖启动时静态导入与延迟加载的模块LoadLibrary运行时动态加载的部分不在分析范围内这一点和老 depends.exe 一致。【免费下载链接】DependenciesA rewrite of the old legacy software depends.exe in C# for Windows devs to troubleshoot dll load dependencies issues.项目地址: https://gitcode.com/gh_mirrors/de/Dependencies创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考