如何确定在Windows Store / Universal Apps中哪个DLL依赖项无法加载?

13

运行我正在工作的一个UWP项目时,我收到了以下对话框。

"无法激活Windows Store应用程序'MyAppsMangledName'。'MyExeName'进程已启动,但激活请求失败,错误为'应用程序未启动'。"

在Visual Studio输出中,以下内容显示如下。

线程0x3d4c已退出,代码为-1073741515(0xc0000135)。 线程0x3b50已退出,代码为-1073741515(0xc0000135)。 程序'MyExeName'已退出,代码为-1073741515(0xc0000135)'找不到依赖性dll'。

事件查看器有3个事件,基本上以3种不同的方式重申弹出对话框,没有其他内容。

在启动期间运行进程监视器会显示许多dll成功加载,但除了一些NAMENOTFOUND事件外,没有任何指示失败的事情,不幸的是这些事件没有显示未找到的名称。

在Win32环境下,有一个有用的对话框通常会指示哪个dll无法加载。当然,对于.Net应用程序,融合日志可以轻松跟踪此问题。但是对于商店/UWP应用程序,我似乎找不到一个好的方法来追踪有问题的依赖项。


3
请尝试使用 Dependency Walker(http://www.dependencywalker.com/)? - Grace Feng
1
Dependency Walker在Store应用程序中存在的问题是报告中存在许多噪音。形式为API-MS-WIN-CORE*.DLL EXT-MS-WIN*.DLL以及一些其他文件,例如DEVICELOCKHELPERS.DLL和EMCLIENT.DLL,该工具无法找到。更糟糕的是,无论运行时是否解决了依赖项,在清单中指定的任何软件包依赖项都不会被找到。这恰好是我遇到的问题。能够在分析下运行可能会解决此问题,但是应用程序必须在沙箱中运行,而Dependency Walker似乎并不知道。 - DubiousPusher
我制作了一个PowerShell模块,用于查找给定模块加载失败的模块。您可以使用"Install-Module LibSnitcher; Import-Module LibSnitcher"命令安装它。项目页面https://github.com/FranciscoNabas/LibSnitcher上有相关文档。 - FranciscoNabas
1个回答

22

在我正在处理的一个项目中,我也遇到了这个问题。经过长时间的挖掘,我的团队中的某个人能够解决它。所以我想为其他遇到同样问题的人分享它。

我们正在使用VS2015进行C++的UWP开发。因此,有一个名为gflags的程序位于C:\program Files(x86)\Windows Kits 10\Debuggers\x64\gflags.exe。

所以你需要用管理员打开cmd窗口,并运行命令gflags.exe -i your-program-name.exe +sls

注意:gflags不在我的路径中,所以要么添加路径,要么在执行命令前导航到其所在位置。

只需传递exe的名称而不带目录即可。它所做的是为VS设置一个注册表设置,使得对于与该名称匹配的exe,打开sls(显示加载器快照)。然后在VS中运行应用程序,您将获得大量dll加载信息,包括无法加载的dll的名称。在我们的情况下,是这样的:

5038:34f4 @ 789320468 - LdrpProcessWork - ERROR: Unable to load DLL: "vccorlib140d_app.DLL", Parent Module: "E:\projects---\Source\Builds\vs2015_Debug_UWP_x64\AppX---.exe", Status: 0xc0000135

另一种更快速的测试方法(YMMV)是将输出与另一个能够正常工作的构建配置进行比较。在我们的情况下,我们可以顺利运行发布版本,但调试版本会出错。而发布版本的输出显示已成功加载了vccorlib140_app.dll,而调试版本则缺少它。


这个现在已经移动到c:\Program Files\Debugging Tools for Windows (x64)了。 - Ian
你是如何解决“无法加载 DLL:“vccorlib140d_app.DLL”问题的? - bluepanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接