Visual Studio 2015 C++ 应用程序需要在客户端客户端上使用 api-ms-win-crt-runti

Visual Studio 2015 C++ app requires api-ms-win-crt-runtime-l1-1-0.dll on client clients

本文关键字:客户端 api-ms-win-crt-runti 2015 Studio C++ 应用程序 Visual      更新时间:2023-10-16

我用Visual Studio 2015社区版构建了一个应用程序。当我的一些用户尝试运行它时,他们会收到以下错误:

程序无法启动,因为您的计算机中缺少 api-ms-win-crt-runtime-l1-1-0.dll。尝试重新安装该程序以解决此问题。

显然,这是通过在 Windows (KB2999226) 中安装通用 C 运行时更新来解决的。我可以在安装脚本期间检查修补程序,但我发现执行此操作的所有方法都太慢或不可靠。

如何防止此错误发生?我可以更改我的解决方案,以便我不需要此依赖项吗?我是否链接到我可以删除的内容?我可以将修补程序与我的应用程序一起重新分发吗?

编辑:在项目属性中,"目标平台版本"是8.1,"平台工具集"是"Visual Studio 2015(v140)",如果这有帮助的话。

编辑 2:我尝试将所有通用 C 运行时库 DLL 复制到应用程序目录,因为Microsoft现在允许(但不建议)UCRT 的本地模式安装。C:Program Files (x86)Windows Kits10RedistucrtDLLsx64有 41 个文件,api-ms-win-crt-runtime-l1-1-0.dll 就是其中之一。但是,现在运行应用程序会导致此错误:

应用程序无法正确启动 (0xc0000142)。单击"确定"关闭应用程序。

我尝试使用 MSVS 2015 调试应用程序,但一无所获。我在依赖沃克中打开了可执行文件,似乎我缺少此答案中列出的类似 DLL,它说依赖沃克很旧,这是一个红鲱鱼。

我尝试通过进程监视器(procmon)运行应用程序,没有任何异常。应用程序只需在WerFault上调用"Process Create".exe然后调用"线程退出"。

编辑 3:我在可执行文件上启用了加载程序快照,并在从 cdb 运行时得到这个,如果它有帮助:

...
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - ENTER: DLL name: api-ms-win-core-sysinfo-l1-2-1.dll.
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - INFO: DLL name api-ms-win-core-sysinfo-l1-2-1.dll was redirected to C:WINDOWSSYSTEM32kernelbase.dll by SxS.
00c0:1200 @ 02106250 - LdrpFindOrMapDll - ENTER: DLL name: C:WINDOWSSYSTEM32kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - ENTER: DLL name: C:WINDOWSSYSTEM32kernelbase.dll
00c0:1200 @ 02106250 - LdrpResolveDllName - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDll - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpFindOrMapDependency - RETURN: Status: 0x00000000
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlSetLastWin32Error" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlLeaveCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlEnterCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlInitializeCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlDeleteCriticalSection" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "RtlQueryPerformanceCounter" by name
00c0:1200 @ 02106250 - LdrpGetProcedureAddress - INFO: Locating procedure "LdrResolveDelayLoadedAPI" by name
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Merging a cycle rooted at USER32.dll.
00c0:1200 @ 02106250 - LdrpMergeNodes - INFO: Adding cyclic module GDI32.dll.
(c0.1200): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
ntdll!LdrInitShimEngineDynamic+0x330:
00007ffc`d68732e8 cc              int     3
0:000>

您应该与 CRT 静态链接。对于使用者应用程序,有很多情况会导致特定DLL丢失或其配置拙劣。我是一个非常流行的Windows应用程序(每天数千次安装)的安装人员技术负责人,你不会相信配置错误的Windows机器是多么普遍。在底部,我将给出一个简短的列表。

通用CRT是个好主意,但相对较新,需要一段时间(可能很长时间),直到它被破坏阻止客户的PC启动。这应该是阈值:如果您的客户无法在没有 DLL X 的情况下登录,那么依赖它是可以的。

常见的怪异状态:

  • MSI安装程序正在进行中:不知何故,Windows认为有一个安装正在进行中
  • COM 数据库不一致:HKCU 部分注册表是一个粗糙的地方
  • 其中缺少 MSVC crt 或预发布版本
  • Windows的预发布版本 :我们猜测预发布窗口更容易盗版。
  • 仍处于系统准备阶段:OEM忘记密封机器配置。
  • 字体损坏:如果使用 DirectWrite 尤其痛苦
  • 超频:文件系统缓冲区中的最终位翻转等于损坏的文件。

我可以检查修补程序

记住这一点非常重要,这不是修补程序。 这是通过 Windows 更新自动提供的正常更新。 所以有一个事实你知道,这些机器没有得到维护。 当然,这是非常坏的消息,出现问题是意料之中的。

缺少 API-MS-WIN-CRT-RUNTIME-L1-1-0.dll

它是一个操作系统 DLL,通常与操作系统安装一起提供,从 Win7 开始。 这应该缩小这些机器的问题范围,它们可能会启动XP。 维斯塔的几率很小。 XP不再由Microsoft维护,因此看到缺少更新并非巧合。

"目标平台版本"是

8.1,"平台工具集"是"Visual Studio 2015 (v140)"

这很好,但您需要在安装程序中仔细检查并拒绝在XP上安装。 仍然可以定位XP,您必须将平台工具集设置更改为"v140_xp"。 不确定该选项在社区版中是否可用,如果是,我会感到惊讶。

有 41 个文件 ...

只有一个算数,ucrtbase.dll。 其余的是应该存在于Windows安装目录中的api-ms-win*.dll文件。 它们包括在内,因此您仍然可以在XP和Vista上运行它,您应该将它们部署到c:\windows\system32或c:\windows\syswow64,具体取决于位数。 请注意,您记录了 x64 目录,验证用户是否具有 64 位版本的 Windows 是您必须在安装程序中仔细检查的另一件事。

应用程序无法正确启动 (0xc0000142)。

也就是说STATUS_DLL_INIT_FAILED,您依赖返回的 FALSE 的 DLL 之一的 DllMain() 入口点。 非常糟糕的消息,不容易调试,您肯定不会尝试使用VS2015解决此问题,因为它不会在您的机器上失败。 您需要打开加载程序快照,以便操作系统加载程序变得健谈。 当然,访问有此问题的计算机是强制性的。

显然,这是通过安装更新来解决的...

是的,我想说是时候减少你的损失了。 没有人可以合理地期望你的应用程序在故意不维护他们的机器或拒绝更新它时能够正常工作。 在安装程序中验证 ucrtbase.dll 是否存在,如果不存在,则停止安装并告诉他们先更新计算机。