简介:Microsoft Visual C++ 2008 Redistributable(x86)是面向32位Windows用户与软件部署人员的VC++ 2008运行时库安装包,主要用于解决未安装完整开发环境时,依赖VC++ 2008编译的程序因缺少运行库而无法启动的问题,也可作为应用分发的必备依赖组件。压缩包共2个文件,包含1个exe安装程序与1个htm说明文档,整体约1.72MB,体积小巧便于随应用附带分发。其中安装程序用于部署运行时DLL并注册相关COM组件,说明文档则汇总安装要求、兼容性信息、已知问题及处理方式,便于部署前核对环境与排查异常。已有2377人学习下载,适合需要兼容旧版Windows软件、维护遗留系统或进行程序打包分发的读者参考使用。
1. 装完主程序却弹 0xc0150002:x86 版 Visual C++ 2008 运行库到底该装哪个
上周又碰到一个典型现场:某开发者在 64 位机器上部署一个老的图像处理 Demo,主程序是 32 位 exe,双击直接弹「应用程序无法启动,因为应用程序的并行配置不正确」,错误码 0xc0150002。他第一反应是缺运行库,于是下载了 x64 版的 Microsoft Visual C++ 2008 Redistributable 装上,重启,再双击,报错一字不差。这类老系统维护、内网小工具分发、教学 Demo 迁移的场景里,Visual C++ 2008 运行库(x86)几乎是最容易装错的一个包——版本号有 RTM 和 SP1 之分,位数有 x86 和 x64 之分,装错了不报安装失败,只在运行程序时给你一个看不懂的 SxS 错误。这篇记录按我实际部署的顺序走一遍:先确认该装哪个版本,再落地安装和静默分发,然后处理新旧版本共存,最后是排错和验证。
2. 装前把环境列清:9.0.21022、9.0.30729 与 x86 位数的选择
动手之前先把三件事定下来:目标机器上跑的是几位的进程、这台机器上已经装了 9.0 系列的哪几个版本、你的分发方式是手动还是脚本。这三件事任何一个判断错,后面装完都是白装。Visual C++ 2008 运行库的安装包不大,安装过程也就十几秒,但它往系统里写的东西比想象中多——WinSxS 程序集、System32 或 SysWOW64 下的 DLL 副本、注册表里的 VCRedist 键值,一旦装错位数,还得手工清理,比装之前多花三倍时间。
2.1 三个容易搞混的版本号:9.0.21022、9.0.30729、9.0.30729.6161
Visual C++ 2008 运行库不是「一个」包,而是 9.0 这个主版本号下面的一串版本。你在不同渠道下载到的vcredist_x86.exe,内部版本号可能完全不一样,而程序在启动时是会按 manifest 里写死的版本来找 DLL 的。常见的几个版本对应关系如下:
| 版本号 | 对应来源 | 典型文件名 | 说明 |
|---|---|---|---|
| 9.0.21022.8 | VS2008 RTM | vcredist_x86.exe | 最早发布的原始版本 |
| 9.0.30729.17 | VS2008 SP1 | vcredist_x86.exe | 应用最广的 SP1 版本 |
| 9.0.30729.4148 | SP1 后续安全更新 | vcredist_x86.exe | 补丁级别 |
| 9.0.30729.6161 | SP1 累积更新 | vcredist_x86.exe | 后期分发最普遍的版本 |
关键在于:这几个版本在 WinSxS 里是并存的,装 6161 不会把 21022 删掉,反过来也一样。所以「我明明装了 2008 运行库,为什么还报找不到」这个问题,八成是装的版本和程序 manifest 里要的版本对不上。我一般的顺序是先装 SP1 系列的 30729(或更高的 6161),因为 9.0 系列带 publisher policy,请求 21022 的程序通常会被重定向到 30729 上;如果碰上特别老、策略重定向不生效的程序,再补装 RTM 的 21022 版本。
提示:同一台机器上同时存在 21022 和 30729 是正常状态,不要去「清理重复项」,删掉哪个都可能让某批老程序起不来。
2.2 从进程位数反推目标机缺哪个包:x86、x64 与 64 位系统上的 32 位进程
这是踩得最多的一个坑。很多人看到「64 位操作系统」就下意识认为要装 x64 的 redist,结果 32 位主程序照样起不来。正确逻辑是:看进程的位数,不看操作系统的位数。一个 32 位 exe 在 64 位系统上运行时,加载的是 SysWOW64 下的 32 位msvcr90.dll,需要的是 x86 版运行库;只有 64 位进程才去找 System32 下的 64 位版本。
判断进程位数最直接的办法是看任务管理器里的「平台」列,或者对 exe 用dumpbin看一眼:
# 查看 exe 的目标平台,x86 表示 32 位,x64 表示 64 位 dumpbin /headers "D:\demo\ImageTool.exe" | findstr "machine" # 输出 machine (x86) -> 需要 vcredist_x86.exe # 输出 machine (x64) -> 需要 vcredist_x64.exedumpbin属于 Visual Studio 自带的工具,机器上没装 VS 的话,用任意十六进制查看器看 PE 头里的 Machine 字段也行,0x014c是 x86,0x8664是 x64。没有dumpbin又不想折腾的话,随便开个 32 位程序看任务管理器「平台」列是不是「32 位」,也能侧推。
实际操作上,一台 64 位机器上既有 32 位程序又有 64 位程序是很常见的,那就 x86 和 x64 两个包都装,互不影响,也不会冲突。真正的翻车点是:只装了 x64,然后花了两个小时怀疑程序本身有问题。
注意:文件名里的
x86指的是运行库本身的位数,不是「给 32 位系统用的」。64 位系统上装 x86 运行库完全正常,这是设计如此。
2.3 装前检查:管理员权限、系统盘空间、已装的旧版本
安装前我固定会跑三条检查,花不了一分钟,但能省掉后面一堆「装到一半回滚」的麻烦。
第一条是权限。vcredist_x86.exe要往 WinSxS 和 System32 写文件、改注册表,必须以管理员身份运行。UAC 弹窗被用户点了「否」的情况我见过不止一次,安装程序退出码是 0,看起来装成功了,其实什么都没写进去。
第二条是系统盘空间。包本身几 MB,但解压出来的临时文件和写进 WinSxS 的程序集加起来会占几十 MB,系统盘剩余空间低于 500MB 的老机器上,装到一半失败的概率不低。
第三条是查已装版本,这条最重要:
# 查询 32 位运行库的注册信息(64 位系统同样查这个路径下的 WOW6432Node) reg query "HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\VC\VCRedist\x86" /v Version reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\VC\VCRedist\x86" /v VersionVersion值能直接告诉你当前装的是 21022 还是 30729。如果已经装了更高版本,而你手里的安装包是更低版本,安装程序会提示「已安装更新的版本」并退出,这不是故障,是正常行为,别去强行卸载旧的再装——卸载过程中,正在使用这些 DLL 的程序会直接崩掉。
3. 安装落地:交互安装、静默参数与批量分发脚本
版本和位数确认完,接下来是把它真正装进去。手动装一台机器和批量装一百台机器,走的其实是同一套东西,区别只在于要不要把界面藏起来。这一章把交互安装的动作拆开看一遍,再给出静默参数和可以直接抄的分发脚本,最后说清楚安装包到底往系统里写了什么,方便后面出问题时定位。
3.1 交互式安装:一路点 Next 背后的三个实际动作
双击vcredist_x86.exe,界面很朴素:许可协议、一个「安装」按钮、一个完成页。看起来只做了一件事,实际上分三步走:先把自解压包里的内容释放到%TEMP%下一个随机目录,然后调用msiexec安装里面的vcredist.msi,最后清理解压出来的临时文件。
这三步里,第一步和第二步之间的中间态就是排错的入口。安装失败时,%TEMP%下会留下dd_vcredist_x86_*.log之类的日志文件,里面有 msiexec 的详细返回码。我排「装到一半回滚」类问题时,第一件事永远是去这个目录翻日志,而不是反复重装。
安装完成页有时候会提示需要重启。多数情况下 2008 运行库装完不需要重启就能生效,但如果安装时有进程正占用着待替换的 DLL,安装程序会把文件改名挂起,等重启时才真正替换。所以如果装完立刻运行程序仍然报错,重启一次再试,别急着下结论说没装上。
3.2 静默安装:/q、/norestart 与解包安装的取舍
批量环境下没人会一台台点按钮,vcredist_x86.exe支持命令行参数,最常用的几个如下:
| 参数 | 作用 | 使用场景 |
|---|---|---|
/q | 静默安装,不显示任何界面 | 脚本分发,默认选这个 |
/qb | 只显示进度条 | 需要让用户知道正在装 |
/norestart | 抑制安装后的自动重启 | 服务器上必加,避免半夜重启 |
/extract:路径 | 只解压不安装 | 需要单独拿 msi 或排查内容 |
一条典型的静默命令:
# /q 静默,/norestart 禁止自动重启,避免服务器被意外重启 vcredist_x86.exe /q /norestart这里有个容易忽略的点:vcredist_x86.exe是个自解压壳,真正的安装动作由内部的vcredist.msi完成,所以/q传下去之后,msiexec 层面还需要重启动控制。/norestart就是干这个的,不加的话,遇到文件被占用的情况,安装程序可能会直接发起重启,在没有预告的服务器上这是大事。
另外,静默安装的退出码要看清楚。0是成功,3010是「成功但需要重启」,1603是安装过程中出现致命错误,1638是「已安装更新版本」。脚本里把3010当失败处理,会导致本来装好了的机器被反复重试,这是很常见的脚本逻辑错误。
如果/q不好使或者想拿到更细的日志,我一般会把 msi 掏出来单独装:
# 第一步:只解压,不安装 vcredist_x86.exe /extract:"C:\temp\vc2008" # 第二步:用 msiexec 安装,/l*v 输出详细日志,/qn 完全静默 msiexec /i "C:\temp\vc2008\vcredist.msi" /qn /norestart /l*v "C:\temp\vc2008_install.log"/l*v会把安装过程中的每一步、每个文件操作都写进日志,出问题时比自解压壳那点输出有用得多。/qn是 msiexec 的完全静默参数,和外壳的/q不是一回事,两个层面分开控制。
3.3 安装包到底往哪写:System32、SysWOW64 与 WinSxS 的分工
知道文件去了哪里,后面看现象才有判断依据。vcredist_x86.exe装完主要落三处:
第一处是 WinSxS,也就是C:\Windows\WinSxS\下面以x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.开头的目录,同一套机制下还有Microsoft.VC90.MFC、Microsoft.VC90.ATL、Microsoft.VC90.OpenMP等程序集。这里是 side-by-side 机制真正读取的地方,目录名里带着完整版本号,所以不同版本能并存。
第二处是系统目录的 DLL 副本。32 位系统上,msvcr90.dll、msvcp90.dll落在C:\Windows\System32;64 位系统上,x86 版的 DLL 落在C:\Windows\SysWOW64,x64 版才落在System32。这个反直觉的映射关系值得记一下,很多「明明装了怎么还找不到」的问题就出在这里。
第三处是注册表,HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\VC\VCRedist\x86下面写Install=1和Version两个值,64 位系统上对应写到Wow6432Node分支。这个键是后面验证安装是否真的生效的主要依据。
提示:WinSxS 目录不要手工删改,也不要用第三方「清理工具」去清,删了之后表现是随机的——某些程序还能跑,某些直接报 SxS 错误,排查成本极高。
3.4 批量分发:把安装写进部署脚本
单机装完没问题,接下来就是推到一片机器上。我的习惯是写一个带完整性检查的批处理,先判断版本,再决定装不装,最后把退出码统一收口。
@echo off setlocal set PKG=\\fileserver\deploy\vc2008\vcredist_x86.exe set LOG=%TEMP%\vc2008_deploy.log REM 先查注册表,已经装过 30729 及以上的就跳过 reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\VC\VCRedist\x86" /v Version 2>nul | findstr /C:"9.0.30729" >nul if %errorlevel%==0 ( echo [SKIP] VC++ 2008 x86 已安装 >> "%LOG%" exit /b 0 ) REM 未安装则静默执行,禁止重启 "%PKG%" /q /norestart >> "%LOG%" 2>&1 set RC=%errorlevel% REM 0 成功,3010 成功但需重启,1638 已装更新版本,三者都视为可用 if %RC%==0 exit /b 0 if %RC%==3010 exit /b 0 if %RC%==1638 exit /b 0 echo [FAIL] RC=%RC% >> "%LOG%" exit /b %RC%这段脚本的关键在于退出码的分级处理。1638表示机器上已经有更新版本,这种情况继续往下走是对的,不应该报错退出;3010表示装好了但要重启,可以标记成「待重启」而不是「失败」。把这三个码都当失败,会导致每次部署都在同一批机器上反复重试,日志里刷出一堆无意义的记录。
另外脚本里查的是Wow6432Node分支,因为大部分目标机器是 64 位系统跑 32 位程序,注册信息就落在那里。如果目标环境里还有纯 32 位系统,两个分支都要查一遍,取或的关系。
4. 配置与共存:让 2005、2008、2010 三个运行库和平共处
装好一个运行库不算完,真实机器上往往同时躺着 2005、2008、2010、2013 好几代 VC 运行库。它们共用msvcrXX.dll这种命名规则,但主版本号不同,理论上互不干扰。实际出问题的场景集中在两处:一是 side-by-side 机制选错了版本,二是有人手工往 PATH 目录里塞 DLL 把加载顺序搞乱了。这一章把这两块讲清楚,再给一个不依赖系统安装的兜底方案。
4.1 side-by-side 机制:manifest 决定加载哪个版本的 90 系列 DLL
程序启动时加载msvcr90.dll的过程,不是按文件名在磁盘上瞎找,而是先读 exe 内嵌或同目录的 manifest,看里面dependentAssembly声明了哪个程序集、哪个版本,然后拿着这个版本号去 WinSxS 里精确匹配。匹配不到就是 0xc0150002 那个经典错误。
一段典型的 manifest 片段长这样:
<!-- exe 的 manifest 里声明依赖 VC90 CRT,版本和公钥必须匹配 --> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> </dependentAssembly> </dependency>processorArchitecture="x86"这行很关键,它决定了加载器去找 32 位程序集,跟操作系统的位数无关。version是请求的版本,如果机器上装的版本低于它,加载器会先看有没有 publisher policy 做重定向,没有就直接失败。
所以排查 SxS 错误的标准动作是:拿到 exe,看它的 manifest 里请求的版本,再对照机器上 WinSxS 里实际有的版本。两边的版本号对上了,问题就不在运行库上,得往别的依赖(比如 MFC90、ATL90 单独的程序集)上找。
4.2 私有程序集兜底:把 CRT 放到 exe 同目录
有些场景不适合改动机器环境,比如绿色版工具、U 盘携带的 Demo、内网里不能随便装软件的老服务器。这时候可以用私有程序集部署:把运行库文件直接放在 exe 旁边,让加载器优先读本地。
需要拷的东西是固定的几个:msvcr90.dll、msvcp90.dll,以及Microsoft.VC90.CRT.manifest,三者放在同一个子目录或者直接放在 exe 同级目录。如果程序用到了 MFC,还要加上mfc90.dll、mfcm90.dll和对应的Microsoft.VC90.MFC.manifest。
# 从已装好的机器上提取私有程序集,用于绿色部署 # WinSxS 下的目录名带哈希和版本,用通配符匹配 xcopy "C:\Windows\WinSxS\x86_Microsoft.VC90.CRT_*\msvcr90.dll" "D:\demo\" /Y xcopy "C:\Windows\WinSxS\x86_Microsoft.VC90.CRT_*\msvcp90.dll" "D:\demo\" /Y xcopy "C:\Windows\WinSxS\x86_Microsoft.VC90.CRT_*\Microsoft.VC90.CRT.manifest" "D:\demo\" /Y这个做法的适用边界要说清楚:只有当 exe 的 manifest 允许查找私有程序集时才有效。有些程序在编译时把 CRT 依赖硬编码成系统程序集,本地放 DLL 也不会被加载。判断办法很简单,拷完直接跑,能跑就是有效,跑不了就老老实实装系统运行库。
注意:从 WinSxS 拷出来的文件不要改名。manifest 里记录了自校验信息,改名或者多个版本混拷,加载器会认为程序集损坏而拒绝加载。
4.3 PATH 与环境变量的三个坑
关于 PATH,先给结论:90 系列的运行库加载不依赖 PATH,把 System32 加不加进 PATH 对它没有影响。但现实里因为 PATH 出的问题一点不少,主要集中在三种情况。
第一种是有人为了「修复」某个程序的 DLL 缺失,把某个版本的msvcr90.dll拷到了C:\Windows\System32以外的某个 PATH 目录里。这时如果程序 manifest 查找失败回退到按文件名搜索,可能加载到那个来路不明的副本,版本不匹配就会在运行中随机崩溃,而不是启动时报错,排查难度翻倍。
第二种是环境变量被第三方软件改乱。某些老软件安装时会往系统 PATH 前面插自己的目录,如果那个目录里恰好有同名的 90 系列 DLL,加载顺序就被改写了。
第三种是 32 位和 64 位目录混用。在 64 位系统上,有人把 x64 的msvcr90.dll拷进了SysWOW64,或者反过来。这种错误不会立刻报错,表现是程序启动后某一刻访问到不兼容的导出函数才崩,非常隐蔽。
我的处理习惯是:出现 DLL 相关异常时,先用where查一遍系统里所有同名文件的位置,确认没有多余副本,再动别的。
# 查系统里所有 msvcr90.dll 的位置,确认没有来路不明的副本 where /r C:\Windows msvcr90.dll # 期望输出只包含 SysWOW64(x86 版本)和 WinSxS 下的路径 # 如果出现第三方目录,基本可以确定是被手工拷贝污染了5. 排查避坑:装不上、装完还报错的两类现场
前四章讲的都是顺利路径,这一章记录的是实际部署里反复出现的失败现场。分成两组:安装阶段失败的,和安装看似成功但运行仍然报错的。每一条按「现象、原因、解决」写,都是我自己的记录,不是从文档里抄的。
5.1 安装阶段的四个高频现象
现象一:双击安装包,进度条走到一半回滚,提示安装失败。
原因多数是%TEMP%目录不可写,或者系统盘空间不足。老机器上还有一种情况:系统盘的权限被某些安全软件改过,msiexec 无法在 WinSxS 下建目录。解决方式是先清理%TEMP%,确认系统盘有至少 500MB 空间,然后以管理员身份重跑;如果还是失败,用/extract解出 msi,再单独用msiexec /i ... /l*v装,看日志里具体卡在哪个文件上。
现象二:安装程序一闪而过,退出码是 0,但注册表里查不到版本。
原因是安装包被当成了普通压缩包处理,或者 UAC 提权被拒绝,进程实际上以受限权限运行,什么都没写进去。解决上先确认是右键「以管理员身份运行」启动的,然后重新查一次注册表;如果仍然为空,去%TEMP%找dd_vcredist*.log,日志里一般会有一行明确的权限拒绝记录。
现象三:提示「已安装更新版本」,安装直接退出。
这不是故障。机器上已经存在 9.0.30729 或更高版本,而手里的包是 21022 的 RTM 版本,安装程序判定没必要降级。解决方式分两种:如果程序 manifest 请求的就是 21022,需要让 RTM 和 SP1 并存,那就得先把高版本卸掉再装低版本,但这样会影响其他程序,风险较高;更稳妥的做法是确认程序是否真的需要 RTM 版本,多数情况下装 SP1 就够了,报错是别的原因引起的。
现象四:脚本批量部署,一部分机器成功一部分失败,日志里全是 1603。
1603是 msiexec 的通用失败码,本身不带信息。常见诱因有三个:目标机器上同时有另一个 msiexec 在跑(Windows Update 或别的安装程序),导致安装事务冲突;安装包所在的网络路径权限不足,解压阶段就失败;系统时间偏差过大导致签名校验失败。解决方式是把包先拷到本地再执行,脚本里加一个「检测 msiexec 是否空闲」的前置判断,以及确认目标机器时间同步正常。
5.2 运行阶段的四个隐蔽坑
现象一:装完运行库,程序仍然报「并行配置不正确」(0xc0150002)。
原因基本可以锁定在版本不匹配上:程序 manifest 请求的版本在 WinSxS 里不存在,且没有可用的 publisher policy 做重定向。解决方式是先用工具读出 exe manifest 里的version字段,再去C:\Windows\WinSxS下找对应目录。找不到就补装对应版本;能找到但版本号对不上,说明是请求的版本过低或过高,装一个匹配的版本让两者并存。
现象二:32 位程序在 64 位系统上报「找不到 msvcr90.dll」。
原因几乎都是装错了包——装了 x64 版 redist,SysWOW64 下没有 32 位 DLL。解决方式是补装vcredist_x86.exe,不需要卸载 x64 版本,两者本来就该并存。装完用where /r C:\Windows SysWOW64\msvcr90.dll确认文件确实到位。
现象三:装完 2008 运行库后,原本正常的某个老程序反而启动不了了。
这是版本覆盖导致的。极少数情况下,手工拷贝 DLL 或者安装某个第三方打包的「运行库合集」,会把旧版本的 DLL 覆盖成不兼容的版本。解决方式是先卸载最近装的那个包,观察老程序是否恢复;恢复之后改用官方安装包逐个安装,不要用合集包一次性铺开。
现象四:程序能启动,但用到某个功能时崩溃,事件日志里是访问冲突。
这类问题多半和 OpenMP 运行时有关。vcomp90.dll属于Microsoft.VC90.OpenMP程序集,如果程序用到了 OpenMP 而机器上只装了 CRT 部分,启动时不会报错,跑到并行段落才崩。解决方式是确认安装包完整(官方 redist 里是带的),如果是私有部署,记得把 OpenMP 对应的 DLL 也一起拷过去。
6. 装完怎么验证:三条命令确认这套运行库真的生效
装完不验证,等于没装。我见过太多「安装程序说成功了」但实际什么都没写进去的现场,所以固定会走下面这套检查,三条命令,一分钟之内能跑完。
第一条查注册表,确认安装记录存在且版本正确:
# 64 位系统上的 32 位运行库记录,正常应返回 Install=1 和具体 Version reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\VC\VCRedist\x86" /v Version reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\VC\VCRedist\x86" /v Install第二条查文件,确认 DLL 真的落到了正确的位置,并且位数对得上:
# 64 位系统上,x86 版运行库的 DLL 应该在 SysWOW64 dir C:\Windows\SysWOW64\msvcr90.dll dir C:\Windows\SysWOW64\msvcp90.dll # 用 PowerShell 读文件版本,确认不是被别的版本覆盖过 powershell -Command "(Get-Item C:\Windows\SysWOW64\msvcr90.dll).VersionInfo.FileVersion"第三条查 WinSxS,确认程序集注册完整。这一步是看 side-by-side 机制的根有没有扎稳:
# 列出所有 VC90 CRT 程序集,能看到多个版本并存是正常的 dir /b C:\Windows\WinSxS | findstr /C:"x86_Microsoft.VC90.CRT"三条都通过,最后一步才是实跑。直接双击目标程序,观察是否还弹 SxS 错误;如果程序启动正常但偶发崩溃,用进程监视工具看它实际加载的是哪个路径下的msvcr90.dll,这一步能定位到 PATH 污染或者私有程序集覆盖的问题。
验收环节我一般会填一张对照表,逐项确认:
| 检查项 | 命令 | 正常结果 |
|---|---|---|
| 注册表安装标记 | reg query ...VCRedist\x86 /v Install | Install REG_SZ 1 |
| 注册表版本号 | reg query ...VCRedist\x86 /v Version | 9.0.30729.x或更高 |
| 系统目录 DLL | dir C:\Windows\SysWOW64\msvcr90.dll | 文件存在,版本一致 |
| WinSxS 程序集 | dir /b C:\Windows\WinSxS | findstr VC90.CRT | 至少一条匹配 |
| 目标程序启动 | 直接运行 | 无 0xc0150002 报错 |
还有一个隐性的验证点:重启之后再跑一遍目标程序。有些机器上安装时文件被占用,安装程序把替换动作挂起到重启,重启前一切正常,重启后反而出问题——这种情况在批量部署里尤其值得留意,别只在不重启的状态下验收。
从那以后我每次装完这套运行库,不管多急,都强制走一遍注册表、文件、WinSxS 这三条检查,再实跑一次目标程序。踩过的坑告诉我,安装程序的「安装成功」四个字,只能说明它自己认为成功了。希望帮到你。
本文还有配套的精品资源,点击获取