我已经使用Visual Studio 2015社区版build立了一个应用程序。 当我的一些用户试图运行它,他们收到以下错误:
程序无法启动,因为您的计算机缺lessapi-ms-win-crt-runtime-l1-1-0.dll。 尝试重新安装程序来解决这个问题。
显然这是通过在Windows中安装通用C运行时更新 (KB2999226)来解决的。 我可以在安装脚本中检查修补程序,但是我发现这样做的所有方法要么太慢,要么不可靠 。
我怎样才能防止这种错误发生? 我可以更改我的解决scheme,以便我不需要这种依赖性? 我是否连接了一些我可以删除的东西? 我可以重新分配与我的应用程序的修补程序?
编辑:在项目属性中,“目标平台版本”是8.1,“平台工具集”是“Visual Studio 2015(v140)”,如果有帮助的话。
编辑2:我已经试过将所有的通用C运行时库DLL复制到应用程序目录,因为微软现在允许(但不build议)本地模式安装的UCRT 。 C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64
有41个文件,而api-ms-win-crt-runtime-l1-1-0.dll
就是其中之一。 但是,现在运行该应用程序导致此错误:
应用程序无法正确启动(0xc0000142)。 单击确定closures该应用程序。
我试过用MSVS 2015debugging应用程序,但没有得到任何好处。 我在Dependency Walker中打开了可执行文件,看起来我错过了这个答案中列出的类似DLL ,它说Dependency Walker是旧的,这是一个红色的鲱鱼。
我尝试通过进程监视器(procmon)运行应用程序,没有什么不寻常的。 应用程序简单地调用WerFault.exe上的“进程创build”,然后“线程退出”。
编辑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:\WINDOWS\SYSTEM32\kernelbase.dll by SxS. 00c0:1200 @ 02106250 - LdrpFindOrMapDll - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.dll 00c0:1200 @ 02106250 - LdrpResolveDllName - ENTER: DLL name: C:\WINDOWS\SYSTEM32\kernelbase.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是一个好主意,但是相对较新,它将会是一段时间(可能很长一段时间),直到它被打破,防止你的客户的电脑启动。 这应该是门槛:如果您的客户不能没有DLL X登录,那么可以依靠它。
常见的怪异状态:
我可以检查修复程序
记住这非常重要,这不是一个修复程序。 这是通过Windows Update自动发送的正常更新。 所以有一个事实你知道,这些机器没有被维护。 这是非常坏的消息,当然有问题是可以预料的。
api-ms-win-crt-runtime-l1-1-0.dll缺失
它是一个操作系统DLL,通常随着操作系统安装一起提供,从Win7开始。 这应该缩小这些机器有什么问题,他们很可能会启动XP。 Vista的赔率很小。 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,其中一个DLL的DllMain()入口点对返回的FALSE有一个依赖关系。 相当不好的消息,不容易调试,你肯定不会在VS2015试图解决这个问题,因为它不会在你的机器上失效。 您需要打开装载程序捕捉,以便操作系统加载器变得健谈。 有机会遇到这个问题当然是强制性的。
显然这是通过安装更新…
是的,我想说,是时候减少你的损失了。 没有人可以合理地期望你的应用程序,当他们故意不维护他们的机器或拒绝更新它的工作。 验证您的安装程序中是否存在ucrtbase.dll,如果没有,则停止安装,并告诉他们先更新机器。