Dependencies 完全实战指南一条命令导出完整依赖链接入 CI 做回归排查【免费下载链接】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客户机器上报 0xC000007DEvent Viewer 里只有一句“The specified procedure could not be found”。这时你需要的是做依赖链分析与 DLL 排查的工具Dependencies——depends.exe 的现代 C# 重写版一条命令导出完整依赖链和导入/导出表。工具定位替代 depends.exe 的现代实现Dependencies 用 C# 重写了随 Windows SDK 分发、早已停止维护的 depends.exeDependency Walker。它模拟 NT Loader 的 DLL 查找顺序递归解析依赖链原生支持 ApiSet 重定向和 x86/x64 混合环境。CLI 与 GUI 共享同一套解析引擎核心 PE 解析在 ClrPhlib/src/unmanaged/UnmanagedPE.cpp命令行版适合自动化GUI 版适合交互式排查。获取 Dependencies 与首次运行一条命令解析依赖链两种获取方式源码构建克隆仓库https://gitcode.com/gh_mirrors/de/Dependencies打开 Dependencies.sln手动选择Release配置和x64平台——默认值可能不是这两个。下载发布包从 Releases 页面下载压缩包解压即用。最简命令格式Dependencies.exe [OPTIONS] FILE不带参数运行或加-help会打印完整帮助帮助文案由 Dependencies/Program.cs 中的DumpUsage生成以最新源码为准。⚠️ 注意受 /clr 编译限制运行 Dependencies 需要已安装 Visual C Redistributable二进制未签名SmartScreen 弹出警告属于正常现象。排查场景一用 -chain 导出完整依赖链定位缺失 DLL痛点报“找不到模块”但你不知道依赖树里哪一层断了。Dependencies.exe -chain MyApp.exe输出怎么读每行形如├ 模块名 (搜索策略) : 解析到的路径。搜索策略标明该 DLL 是按 NT Loader 的哪条规则找到的常见值有ROOT、ApiSetSchema、WellKnownDlls、System32Folder、Environment、NOT_FOUND完整枚举见 DependenciesLib/FindPeModule.cs。标注NOT_FOUND的节点就是你要找的缺失 DLL它上面的父节点告诉你谁在引用它。树太深时用-depth限制递归深度默认无限Dependencies.exe -chain -depth 2 MyApp.exe只想快速核对“一共解析到哪些模块”用-modules输出按策略排序的扁平清单问题涉及 WinSxS 组件库时用-sxsentries列出文件的 SxS 依赖项未解析的条目路径带???标记解析逻辑在 DependenciesLib/SxsManifest.cs。 同一个 DLL 在不同环境可能命中的策略不同开发机上ApplicationDirectory命中客户机上NOT_FOUND对比两侧输出里的策略字段往往比只看路径更能定位问题。排查场景二用 -imports / -exports 转储导入表与导出表痛点报的不是“找不到模块”而是“找不到过程”——DLL 加载了但函数不在。Dependencies.exe -imports MyApp.exe Dependencies.exe -exports kernel32.dll输出怎么读-imports按导入源 DLL 分组函数按名字或Ordinal_xxx序数导入输出延迟加载项会单独标注(Delay Import)-exports列出每个导出的序数、名称和虚拟地址转发导出会多一行ForwardedName——说明该函数实际由另一个 DLL 定义顺着转发名去找真正的实现。⚠️ 延迟导入的 DLL 直到首次调用函数时才加载缺了它程序启动不会崩而是运行到某个功能点才触发崩溃。看到(Delay Import)标注的条目优先核实对应 DLL 是否随包分发。排查场景三.NET 程序集与清单排查痛点.NET 程序报程序集解析失败或者清单缺失导致权限、兼容性问题。Dependencies.exe -assemblyrefs MyApp.exe Dependencies.exe -modulerefs MyApp.exe Dependencies.exe -manifest MyApp.exe输出怎么读-assemblyrefs列出程序集引用并尝试在本地目标文件所在目录解析出实际版本解析不到就只打印名字-modulerefs列出模块引用-manifest转储文件内嵌的 SxS 清单XML 格式清单格式非法时直接输出解析异常。仓库自带的回归脚本 test/manifest-regress/Test-ManifestRegress.ps1 就是用-manifest验证 asmv3 命名空间、资源索引 1 等边界用例的写自己的验证脚本可以参考它的断言思路。JSON 输出接入 CI 回归三种典型玩法大多数命令都支持-json开关把结果序列化为缩进 JSON序列化实现在 Dependencies/Program.cs 的JsonPrinterDependencies.exe -json -chain MyApp.exe deps.json Dependencies.exe -json -imports MyApp.exe三个 CI 玩法依赖变更检测每次构建后导出 JSON 快照与基线 diff依赖集悄悄变了就能及时发现缺失 DLL 断言脚本解析 JSON只要存在SearchStrategy: NOT_FOUND的节点就让流水线失败报告归档把deps.json作为构建产物归档事后排查有据可查。PowerShell 场景直接ConvertFrom-Json消费输出即可无需额外依赖。 注意-modules目前不支持 JSON 输出源码会直接提示“Json output is not currently supported”。自动化脚本请改用-chain或-imports。系统级诊断-knowndll / -apisets 速查这些开关不依赖目标文件用于排查系统级依赖问题命令作用-knowndll列出系统 KnownDlls 白名单x86 与 x64解释“为什么加载了 System32 里那个同名 DLL”-apisets转储系统 ApiSet 重定向表api-ms-win-core-*.dll→ 宿主 DLL-apisetsdll FILE从apisetschema.dll文件转储 ApiSet 表仓库 test 目录下有apisetschema.v*.dll测试素材-cache启用二进制缓存读取时把 PE 复制到%LocalAppData%\Dependencies再打开防止原文件被锁定ApiSet 就像一张 DLL 的“转发路由表”Windows 8.1 起大量api-ms-win-*.dll在磁盘上并不存在加载器靠这张表找到真正的宿主 DLL。“找不到 api-ms-win-*.dll”的报错根源通常是宿主 DLL 缺失跑一次-apisets对照即可排查。完整参数速查表参数需要 FILEJSON 支持一句话说明-chain是支持转储完整依赖链递归树-modules是不支持转储已解析模块的扁平清单-imports是支持转储导入表函数级含延迟导入-exports是支持转储导出表含转发导出-assemblyrefs是支持转储 .NET 程序集引用-modulerefs是支持转储模块引用-manifest是支持转储内嵌 SxS 清单-sxsentries是支持转储 SxS 依赖项-apisetsdll是支持从 apisetschema 文件转储 ApiSet 表-knowndll否支持列出系统 KnownDlls-apisets否支持转储系统 ApiSet 重定向表-json/-cache/-depth N/-help——全局开关收尾Dependencies 把退役的 depends.exe 的排查能力装进了脚本-chain看清依赖全貌-imports/-exports定位函数级问题-json让整个排查过程可复现、可回归。对长期和 DLL 加载问题打交道的 Windows 开发者它是当前最值得放进工具箱的开源方案。【免费下载链接】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),仅供参考