ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Win7 安装 VS2015 报错 KB2999226 不适用?补丁排查与离线安装全指南

Win7 安装 VS2015 报错 KB2999226 不适用?补丁排查与离线安装全指南 在 Windows 7 上装 Visual Studio 2015最容易撞上的第一道坎就是安装程序启动后弹出来的一行提示——需要更新 KB2999226。这个报错听起来不复杂真正处理起来却有不少变数有些机器双击补丁就装好了有些却一直提示“不适用”装完 VS2015 之后还可能继续报各种以 api-ms-win-crt、vcruntime140 开头的 DLL 缺失。我前前后后处理过不少这种老环境今天就把整套流程和踩过的坑完整写一遍给还在 Win7 上折腾 VS2015 的朋友做个参考。这篇文章不是简单给你一个下载链接而是把“为什么要装这个补丁”“装了之后到底有没有生效”“报错的时候怎么排查”一次讲清楚。适合四类人看一是 Win7 下装 VS2015 报错的开发者二是维护旧项目、需要重新搭建编译环境的运维或测试三是用 Qt 5.12 搭配 MSVC2015 工具链的人四是帮别人远程处理旧电脑的同学。1. 为什么 VS2015 在 Win7 上非要补 KB29992261.1 这个补丁补的其实是“通用 C 运行时”VS2015 是一个分水岭。从这一版开始微软把原来散落在 MSVCRT、MSVCP 里的 C/C 运行时逻辑重新整理成了 Universal CRT简称 UCRT通用 C 运行时。你可以把它理解成一套“系统级的公共库”原本每个软件自己背一坨运行库现在统一由操作系统提供底层支持应用层只需要调用 Windows 自带的 API。这套思路在 Win10 里是默认集成的所以 Win10 上装 VS2015 和 VC 2015 Redistributable 很少出问题。但 Win7 是在 UCRT 设计之前发布的系统里只有老一代的 msvcrt.dll没有新的 UCRT 组件。微软的选择是通过 Windows Update 下发一个系统更新把 UCRT 的运行时文件和相关 API 集装进 Win7。KB2999226 就是承担这个职责的补丁包。如果你没装 KB2999226直接去运行 VS2015 编译出来的程序最容易见到的现象就是一连串 DLL 缺失提示api-ms-win-crt-runtime-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllvcruntime140.dllmsvcp140.dll看到这些文件名先别急着去乱七八糟的“DLL 下载站”找文件。这些 api-ms-win-crt-* 不是普通应用 DLL它们是 UCRT 的 API set 转发层需要以系统更新的形式安装到位才算干净。单独抠几个 DLL 丢进 System32 属于治标不治本后面版本一旦对不上照样闪退、报错。1.2 除了 KB2999226 还会踩到哪些关联补丁实际处理中你会发现KB2999226 经常不是唯一需要的补丁。VS2015 在 Win7 上的安装检查项里至少还可能牵涉另外两个KB3118401这是 UCRT 的后续更新版本补了 KB2999226 暴露出来的一些运行时问题和兼容性问题。很多机器先装了 KB3118401再回头装 KB2999226反而会被告知“不适用”因为 KB2999226 已经被后继版本覆盖了。KB2533623这个名字看起来和 UCRT 没关系但它解决的是 Win7 缺少安全引导相关 API 的问题VS2015 的某些组件在安装检测时会连带检查。所以在开始动手之前建议你把三个补丁的安装包都准备好而不是只盯着一张 KB2999226 的纸条。实际环境里更新顺序、系统 SP 版本、位数、语言都会影响结果准备越充分报错越少。另外多说一句如果你手里的 Win7 是特别老的镜像系统连 SHA-2 代码签名支持都没有那么后续访问微软更新服务、解压新版本补丁时还会遇到签名校验失败。这种场景通常要先补 SHA-2 支持补丁。这个我放在后面的章节讲因为它和 KB2999226 的安装失败经常纠缠在一起。2. 安装前的准备工作和下载清单2.1 先看清楚系统版本和位数拿到一台报错的机器第一件事不是下载补丁而是确认系统信息。右键“计算机”选“属性”看一眼两项内容系统版本是不是 Windows 7 SP1系统类型是 32 位还是 64 位。为什么必须看 SP 版本因为 KB2999226 这类新式更新包几乎都要求系统至少是 Windows 7 SP1。如果机器还停在 RTM 版本Windows Update 会直接拒绝安装报“此更新不适用”或者含糊的 0x800f081e。遇到这种情况先把 SP1 补丁打上再回来装 KB2999226。位数同样重要。这不是随便看一眼的事因为 VS2015 在 64 位系统上会同时加载 32 位和 64 位的运行库所以 64 位 Win7 上经常需要把 x86 和 x64 两个版本的 UCRT 更新包都装进去。很多人只装了 64 位的 KB2999226结果 VS2015 主程序起来了编译出来的 32 位程序一运行就报 api-ms-win-crt-runtime-l1-1-0.dll 缺失这时候其实是 64 位系统里缺了 32 位那套 UCRT。建议你在命令行里顺手跑一下确认wmic os get caption, osarchitecture输出会是 “Microsoft Windows 7 Service Pack 1” 加上 “64-bit” 或 “32-bit”这行信息记下来后面下载补丁包时一对就能避开选错版本。2.2 补丁包怎么下载、去哪下微软更新包的标准发行格式是 .msu文件名类似Windows6.1-KB2999226-x64.msuWindows6.1-KB2999226-x86.msuWindows6.1-KB3118401-x64.msuWindows6.1-KB3118401-x86.msuWindows6.1-KB2533623-x64.msuWindows6.1-KB2533623-x86.msu优先去微软官方更新目录和微软下载中心找注意认准系统版本和位数。如果某些补丁在官方页面上被标记为“替代”或“已由后续更新取代”不要慌张这属于正常状态KB3118401 本身就是替代 KB2999226 的更新。这里有一个非常容易踩的坑很多人从各种所谓“补丁下载站”抓一个 KB2999226 回来装到一半卡住或者装完系统不稳定。补丁包这类东西来源必须干净我个人的原则是只从微软官方渠道下载或者从可信部署镜像里提取。一个文件被第三方改动过的补丁比不装还危险。官方下载中心找不到的时候也可以借助更新目录搜索搜索 KB 编号找到匹配语言和架构的更新下载下来的 .msu 内容一致用起来放心。2.3 VS2015 安装包也提前准备好修补丁只是第一步最终目的还是把 VS2015 装好。如果你需要离线安装 VS2015建议拿到安装镜像后先做一次本地布局把在线安装路径变成离线缓存省得安装过程中反复联网下载。VS2015 安装程序支持 /layout 参数比如把安装源放到 D:\vs2015_offlinevs_enterprise.exe /layout D:\vs2015_offline执行后会先下载完整安装源到指定目录之后在目标 Win7 上直接运行该目录里的 vs_enterprise.exe 即可。注意这一步建议在能联网的新机器或虚拟机上先做下载体量比较大耐心等完再说。Win7 机器本身网络条件不好的话在线安装 VS2015 会非常痛苦动不动就卡在“正在下载”或“正在安装”不动。另外如果你只是要跑 VC 2015 编译出来的程序不一定需要装完整 VS2015安装 VC 2015 Redistributable 就好。但 Redistributable 包本身也要依赖 UCRT所以 KB2999226 依然绕不开。说到底这个补丁是“地基”不管是 VS2015、VC 2015 运行库、还是基于 MSVC2015 工具链编译出来的软件地基不牢一样出问题。3. KB2999226 补丁安装的完整实操流程3.1 最常规的安装方式wusa拿到 .msu 文件后最简单的方式是直接双击系统会调用 Windows Update 独立安装器wusa.exe执行安装。双击后按界面提示一步一步来如果顺利的话进度条走完会提示重启。从命令行也能完成同样操作而且更可控wusa.exe C:\patch\Windows6.1-KB2999226-x64.msu /quiet /norestart/quiet 意味着静默安装不弹进度窗口/norestart 让它在完成后不自动重启。这适合批量操作但如果你对结果没底我建议先不带 /quiet 跑一次至少能看到错误信息。静默安装一旦出错信息藏在 CBS 日志里排查起来绕一大圈。装完之后重启是必须的别偷懒。UCRT 相关的 DLL 和注册表项在系统运行中会被大量进程占用不重启的话更新状态很容易处于“待完成”状态VS2015 安装程序仍然认为条件不满足。重启后验证补丁状态用 wmic 查一下wmic qfe list brief /format:table | find 2999226如果补丁确实安装成功输出会包含“KB2999226”字样。用 DISM 查也一样dism /online /get-packages /format:table | find 2999226看到“已安装”三个字就可以继续装 VS2015 了。3.2 遇到“不适用”和 0x800f081e 的替代方案实际处理最多的并不是补丁下载不到而是双击后窗口很快弹出来几十秒就显示“此更新不适用于此计算机”错误码经常是 0x800f081e。这种情况下很多人第一反应是“系统坏了”其实不一定。我拆过好几个这种现场常见原因有三个系统已经 KB3118401 或更高版本覆盖了 KB2999226所以后者显示不适用。系统不是 SP1更新包要求的基线不满足。Windows Update 缓存或者组件存储状态异常导致安装器无法正确识别。先别急着处理先把已安装的更新扫一遍wmic qfe list brief /format:table | find 3118401如果看到 KB3118401 已安装那 KB2999226 根本不用再装了KB3118401 已经把功能全部覆盖。这种“不适用”不是错误是提示你不需要重复劳动。确认系统没有后继更新也没有 SP 问题后还是遇到不适用就可以祭出 DISM 安装大法。DISM 是 Windows 组件服务映像管理工具可以绕过 Windows Update 独立安装器的一些前置检查直接向系统组件仓库添加更新包dism /online /add-package /packagepath:C:\patch\Windows6.1-KB2999226-x64.msu注意 /packagepath 后面要写完整路径路径里不要有中文和特殊符号免得 Dism 解析出问题。这个命令跑起来可能比较慢白色光标在屏幕上闪烁是正常现象别中途关窗口。DISM 安装成功后会提示“操作成功完成”这时再重启然后用验证命令确认。如果 DISM 还报错可以继续清理 Windows Update 缓存后再试net stop wuauserv rd /s /q C:\Windows\SoftwareDistribution net start wuauserv清理 SoftwareDistribution 目录会清掉已下载的更新缓存不影响已安装的补丁可以放心执行。前提是先停掉 Windows Update 服务目录里文件被占用时删不干净所以顺序不能反。4. 装完补丁后怎么验证以及 VS2015 安装本身的坑4.1 关键 DLL 到底在不在补丁状态显示“已安装”不代表万事大吉我遇到过好多次系统列表里有补丁但实际运行库 DLL 不完整的情况多半是更新安装到一半被安全软件拦截或者系统文件损坏。装完补丁后建议检查关键的 UCRT 转发层文件是否存在。在 64 位系统上先看 64 位的dir C:\Windows\System32\api-ms-win-crt-runtime-l1-1-0.dll再看 32 位的注意是 SysWOW64 目录dir C:\Windows\SysWOW64\api-ms-win-crt-runtime-l1-1-0.dll同时也可以看 vcruntime140.dlldir C:\Windows\System32\vcruntime140.dll dir C:\Windows\SysWOW64\vcruntime140.dll如果这些文件都存在说明 UCRT 落地正常可以放心装 VS2015。如果某个目录下文件缺失优先补装对应位数的 KB3118401 或 KB2999226 更新包而不是复制一个 DLL 进去。复制 DLL 只能骗过安装程序一瞬间但版本会被后续更新覆盖出偏差编译链接的时候很容易出些莫名其妙的奇怪错误。4.2 VS2015 安装程序自身的常见中断点补丁解决之后VS2015 安装器还会继续踩其余的检查项这也是“vs2015安装教程”之所以在搜索里居高不下的原因。常见的中断点包括第一个是 .NET Framework 版本不满足。VS2015 依赖 .NET Framework 4.6 及以上版本Win7 默认只带 3.5.1所以安装器经常会提示“需要安装 .NET Framework 4.6”。这一步建议提前装好省得现场再等下载。第二个是 Windows 7 需要安装某些可选组件比如“适用于 Windows 7 的 Internet Explorer 11”。IE11 这不纯粹是为了浏览器它带进了很多系统组件和更新包VS2015 的组件检测会把它列进去。第三个是安装日志排错。如果 VS2015 安装中途失败窗口上显示的“安装失败”往往很笼统。真正的细节在临时目录的日志文件里安装器会把日志写到 %temp% 下文件名通常是 dd_vs_enterprise_.log、dd_installer_.log 这类。打开后搜索 “Error” 或 “Failed” 关键词才能定位到具体是哪个组件出问题。如果 VS2015 安装器反复中途退出而且你确认补丁已经装好可以试试把杀毒软件、安全卫士临时退出再把用户账户控制降到默认级别重新运行安装程序。很多 Win7 老机器上安全软件和 VS 安装器抢文件、锁注册表都会导致看似莫名其妙的回滚。4.3 离线安装和在线安装的选择Win7 上装 VS2015我的建议是尽量走离线安装或先做好离线布局不要裸连网络现场下载。原因很简单VS2015 版本较老新版安装器在 Win7 上的网络堆栈兼容性并不理想在线下载经常卡在进度条不动或下载到一半组件损坏最后报个几何级数般的错误码。离线布局命令前面已经给了vs_enterprise.exe /layout D:\vs2015_offline这里补一个细节在 64 位系统上布局和安装时建议拿走安装包里的 x86 和 x64 两套全部组件不要精简。VS2015 用来编译 32 位程序时大量的工具集组件是 32 位版本你只保留 x64 会在安装列表里缺失一大块非常坑。5. 高频问题排查表和几种特殊场景的处理5.1 缺失 api-ms-win-crt 和 api-ms-win-core-path 相关 DLL程序运行时报 api-ms-win-crt-runtime-l1-1-0.dll 或 api-ms-win-core-path-l1-1-0.dll 缺失是我在 Win7 用户里看到频率最高的运行时错误。区别在于前者属于 UCRT后者属于 API set 体系里的核心路径组件。如果是 api-ms-win-crt- 开头直接用 KB2999226 / KB3118401 补丁即可解决。如果是 api-ms-win-core-path-l1-1-0.dll这个文件在部分较老的 Win7 更新体系里没有被覆盖需要确保所有重要更新都装完才行。这里必须强调不要去下载站拿一个 api-ms-win-core-path-l1-1-0.dll 放进 System32。这个 DLL 是系统 API set 的虚拟转发层不是一个独立完整实现单独放进去基本没有任何效果还可能触发系统的“受保护的系统文件”自动修复机制反而把周围环境搅乱。正确路径永远是装对应补丁 → 重启 → 验证。5.2 Win7 搭配 Qt 5.12.9 和 MSVC2015 工具链搜索词里出现“win7安装qt5.12.9”“vs2015配置qt实现tcp对话”这个场景很具体。Qt 5.12.9 是最后几个官方支持 Win7 的版本之一它的 msvc2015_64 套件编译出来的程序运行时同样需要 UCRT 和 VC 2015 运行库支撑。在 Win7 上用 Qt 5.12.9 做 TCP 对话这类网络程序时开发机上经常出现的问题是Qt 工程能编译但双击 exe 提示 vcruntime140.dll 缺失。TCP 程序在开发机正常拷到另一台 Win7 上启动即崩溃。32 位套件编译出来的程序在 64 位 Win7 上仍报 api-ms-win-crt 相关 DLL 缺失。这类问题绝大多数不是代码逻辑问题而是目标机器缺少运行时组件。送测或部署前把 VC 2015 Redistributable 和 KB2999226/KB3118401 打好问题直接消掉一大半。Qt 程序本身还有自己的 plugins 目录如果报的是平台插件加载失败那就属于另一个排查方向和补丁无关别混淆。5.3 老镜像重装系统的推荐处理顺序如果 Win7 系统本身实在烂到补丁都打不进去了比如镜像太老、组件仓库损坏、Windows Update 服务无法启动我建议直接重装而不是耗死在修复补丁的路上。重装后按顺序走能省下大量时间装 Win7 镜像进系统后先联网把系统补丁打到最新尤其是 SP1、SHA-2 支持更新。安装 IE11 和 .NET Framework 4.6/4.7。安装 KB2999226/KB3118401重启验证。安装 VC 2015 Redistributable 或直接装 VS2015。这个顺序不是拍脑袋排的。SP1 提供现代组件基线SHA-2 支持保证后续更新能通过签名校验UCRT 提供 VS2015 运行库地基。跳过任何一步后面都会以奇奇怪怪的报错形式找上门来。6. 最后的经验和一些零碎提醒处理这么多台 Win7 之后我个人的体会是KB2999226 不难装难的是很多人不知道它已经在系统里被替代或者误以为“不适用”就是系统坏了。遇到补丁安装失败不要第一时间去搜绿色版补丁、DLL 修复工具先确认系统 SP 版本、位数、已安装更新列表把已知信息排干净再动手效率最高。还有一点容易被忽略Win7 上的老项目环境尽量保持“一次性把运行库打全”的习惯。VS2015、VC 2015 Redistributable、UCRT 更新、.NET 4.6、IE11这些基础件缺一不可。组合起来看着占用磁盘空间不少但换来的是不用反复补坑。最后分享一个小技巧如果你在 Win7 虚拟机里测试这些补丁装完后的效果建议在打快照之前先做一次“安装前状态记录”把已安装补丁列表导出来wmic qfe list brief /format:table C:\patch-before.txt装完补丁后再导一份用文件对比工具看一眼更新是否安装成功一目了然。很多 Windows Update 界面上的显示是不完整的命令行才是靠谱的真相来源。这个方法我在处理 VS2015 安装现场时用过很多次几乎每次都能快速找到缺失项。
返回列表