如何确定在 Windows Store/Universal 应用程序中加载失败的 Dll 依赖项?

How to Determine Which Dll Dependency is Failing to Load in Windows Store/Universal Apps?

当 运行 我正在处理一个 UWP 项目时,我收到以下对话框。

"Unable to activate Windows Store app 'MyAppsMangledName'. The 'MyExeName' process started, but the activation request failed with error 'The App didn't start'."

Visual Studio 输出具有以下内容。

线程 0x3d4c 已退出,代码为 -1073741515 (0xc0000135)。 线程 0x3b50 已退出,代码为 -1073741515 (0xc0000135)。 程序 'MyExeName' 已退出,代码为 -1073741515 (0xc0000135) 'A dependent dll was not found'.

事件查看器有 3 个事件,基本上以 3 种不同的方式重述弹出对话框,仅此而已。

运行 启动期间的 Process Monitor 显示许多 dll 已成功加载,但除了一些 NAMNOTFOUND 事件外没有任何指示失败,不幸的是没有显示找不到什么名称。

在 Win32 中,一个有用的对话框通常会指示无法加载哪个 dll。当然,对于 .Net 应用程序,融合日志可以非常直接地进行跟踪。但是对于 Store/UWP 应用程序,我似乎找不到追踪违规依赖项的好方法。

这对我正在进行的项目也很重要。经过大量挖掘,我团队中的某个人终于弄明白了。所以我想我会把它分享给其他遇到同样问题的人。

我们正在使用 VS2015 使用 C++ 执行 UWP。因此,考虑到这一点,我在 C:\program Files (x86)\Windows Kits 10\Debuggers\x64\gflags.exe

找到了一个名为 gflags 的程序

所以你需要一个 cmd window 和管理员 运行 命令 gflags.exe -i your-program-name.exe +sls

注意:gflags 不在我的路径中,因此在执行命令之前添加路径或导航到它所在的位置。

直接传入exe文件名即可,不带目录。它所做的是为 VS 设置注册表设置,为与该名称匹配的 exe 打开 sls(显示加载程序快照)。然后 运行 你在 VS 中的应用程序,你会得到大量的 dll 加载信息,包括在你的输出中加载失败的 dll 的名称 window。在我们的例子中是这样的:

5038:34f4 @ 789320468 - LdrpProcessWork - 错误:无法加载 DLL:"vccorlib140d_app.DLL",父模块:"E:\projects---\Source\Builds\vs2015_Debug_UWP_x64\AppX---.exe",状态:0xc0000135

另一种更快的测试方法 (YMMV) 是将输出与另一个有效的构建配置进行比较。在我们的例子中,我们可以 运行 发布构建就好了,但是调试构建 barf。发布输出显示 vccorlib140_app.dll 已加载,而调试却丢失了它。