简介:这份资源面向在 Windows Server 2012 上部署旧版应用的运维人员与系统管理员,用于解决 .NET Framework 3.5 安装失败、无法从 Windows Update 获取组件等常见问题。资源包内含完整的 SxS 组件,可在无完整 ISO 镜像或服务器断网、防火墙受限的环境下离线启用 NetFx3 功能,覆盖 WPF、WCF、WF 等关键框架组件。压缩包为 zip 格式,共 1569 个文件,约 101.69MB,以 dll、resx、exe、aspx、config、sql 等类型为主,分别对应框架运行库、资源文件、可执行程序及配置脚本,并附有使用说明文本,便于按指引完成安装。目前已有 10488 人学习下载,适合需要运行依赖 .NET 3.5 的旧版业务系统或服务的管理员参考,可帮助快速定位安装失败原因、掌握离线部署思路并完成框架启用。
1. 装 .NET 3.5 卡在 0x800F0906:为什么 Windows Server 2012 离线装反而更稳
在 Windows Server 2012 上装 .NET 3.5,十个运维里至少有六个第一次会翻车。现象很统一:服务器管理器里勾选“.NET Framework 3.5 功能”,进度条走到一半弹窗报错,错误码 0x800F0906 或 0x800F081F,提示“无法从 Windows 更新下载所需文件”。这不是系统坏了,而是 Server 2012 默认把 .NET 3.5 的源文件从本地组件存储里剥离了,安装时它想联网去 Windows Update 拉,但生产环境的内网服务器往往没有外网出口,于是直接卡死。更麻烦的是,很多老业务系统、财务软件、部分工业控制程序只认 .NET 3.5,装不上就跑不起来。这篇笔记记录的是用--sxs参数配合 Windows Server 2012 安装镜像里的sources\sxs目录做离线安装的完整过程,适合手里有 ISO 或已挂载镜像、又不想给服务器开外网的运维和开发。核心思路一句话:把镜像里的 sxs 文件夹当成本地源,用 DISM 指定路径安装,绕开联网检查。
2. 装前把环境对清楚:版本、镜像和权限一个都不能错
2.1 确认系统版本和 .NET 3.5 的对应关系
Windows Server 2012 对应的是 .NET Framework 3.5 功能组件,不是独立安装包。它和 .NET 4.x 可以共存,但安装机制完全不同:4.x 是独立安装程序,3.5 是系统功能,必须通过服务器管理器或 DISM 启用。版本上,Server 2012 的 RTM 和后续补丁级别对 sxs 源的要求一致,但如果你用的是 Server 2012 R2,镜像里的 sxs 路径结构相同,命令也通用。我一般会先跑一条命令确认当前系统版本和已装功能:
# 查看系统版本和内部版本号 systeminfo | findstr /B /C:"OS Name" /C:"OS Version" # 查看 .NET 3.5 当前状态,State 为 Disabled 说明未启用 dism /online /get-featureinfo /featurename:NetFx3第一条命令输出里OS Name会显示 Microsoft Windows Server 2012 或 2012 R2,OS Version是 6.2 或 6.3。第二条命令的State字段如果是Disabled,说明功能没开;如果是Enabled但程序仍报错,那可能是 32 位和 64 位组件没装全,后面排错章节会讲。这里要注意,NetFx3是功能名,不是包名,大小写不敏感,但拼错会提示功能不存在。
2.2 准备匹配的安装镜像和 sxs 源
离线安装的关键是找到和当前系统版本匹配的sources\sxs目录。如果你手里有 Windows Server 2012 的 ISO,直接挂载或解压,进到sources\sxs,里面应该有一堆.cab文件,比如microsoft-windows-netfx3-ondemand-package.cab。这个目录就是本地源。我一般会把整个 sxs 文件夹复制到服务器本地磁盘,比如D:\sxs,避免安装过程中镜像被卸载或路径变动。复制前核对一下文件数量,正常有几十个 cab,如果只有几个,说明镜像不完整。另外,Server 2012 和 2012 R2 的 sxs 不能混用,版本必须和系统内部版本号一致,否则 DISM 会报“源文件不匹配”。权限方面,操作账户需要本地管理员,普通管理员账户如果 UAC 开启,建议用“以管理员身份运行”打开命令提示符。
2.3 关闭 Windows Update 自动检查避免干扰
安装前我习惯先把 Windows Update 服务临时停掉,防止 DISM 在安装过程中试图联网检查更新,拖慢速度甚至触发超时。命令如下:
# 停止 Windows Update 服务 net stop wuauserv # 确认服务已停止,Status 应为 Stopped sc query wuauservnet stop会停止服务,sc query用来确认状态。这一步不是必须的,但在内网环境里能减少很多玄学等待。装完 .NET 3.5 后记得把服务起回来,否则系统补丁更新会受影响。如果你用的是域环境,组策略可能强制更新服务运行,那就跳过这步,直接进安装。
3. 用 DISM 加 --sxs 参数离线安装:命令逐段拆开讲
3.1 基础安装命令和参数含义
核心命令就一条,但每个参数都值得说清楚:
# 以管理员身份运行,指定本地 sxs 源离线安装 .NET 3.5 dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sxs /LimitAccess/online表示操作当前运行的系统,不是离线映像。/enable-feature是启用功能。/featurename:NetFx3指定 .NET 3.5 功能。/All会启用该功能的所有父级依赖,避免只装一半。/Source:D:\sxs是关键,指向你复制到本地的 sxs 目录,路径不要带引号除非有空格。/LimitAccess告诉 DISM 不要联系 Windows Update,只用本地源,这是绕开 0x800F0906 的核心。执行后如果看到“操作成功完成”,基本就成了。整个过程大概一两分钟,比联网快得多。
3.2 指定多个源路径和镜像盘符的写法
有时候 sxs 目录不在本地磁盘,而在挂载的 ISO 里,盘符可能是E:\sources\sxs。命令改成:
# 从挂载的 ISO 盘符读取 sxs 源 dism /online /enable-feature /featurename:NetFx3 /All /Source:E:\sources\sxs /LimitAccess如果系统提示找不到源,可以加多个/Source参数,DISM 会按顺序找:
# 多个源路径,用分号隔开,DISM 依次尝试 dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sxs;E:\sources\sxs /LimitAccess分号前后不要有空格,否则可能被解析成两个参数。我一般会把 sxs 复制到本地固定目录,避免盘符变化。另外,如果服务器是中文版系统,sxs 目录里的 cab 文件名可能带语言标记,但 DISM 会自动匹配,不用手动挑。
3.3 安装后的状态确认和日志位置
装完别急着关窗口,先确认功能状态:
# 查看 NetFx3 功能状态,State 应为 Enabled dism /online /get-featureinfo /featurename:NetFx3输出里State : Enabled就对了。如果还是 Disabled,看日志。DISM 日志在C:\Windows\Logs\DISM\dism.log,用记事本打开搜error或0x800,能看到具体失败原因。常见的是源路径不对或 cab 文件损坏。另外,C:\Windows\Logs\CBS\CBS.log也会记录组件安装细节,但文件很大,建议用findstr过滤:
# 在 CBS 日志里搜 NetFx3 相关错误 findstr /C:"NetFx3" C:\Windows\Logs\CBS\CBS.log这一步能帮你快速定位是源的问题还是系统组件存储的问题。
4. 避坑与排查:0x800F0906 之外的五个血泪经验
4.1 现象:报错 0x800F0906,提示无法下载
原因:DISM 默认去 Windows Update 找源,但服务器没外网或更新服务被禁用。解决:加上/Source和/LimitAccess参数,强制走本地 sxs。如果已经加了还报这个错,检查路径是否写错,比如把sources\sxs写成了source\sxs,少个 s 就找不到。
4.2 现象:报错 0x800F081F,提示源文件缺失
原因:sxs 目录里的 cab 文件不完整,或者镜像版本和系统版本不匹配。解决:重新挂载原始 ISO,核对sources\sxs下的文件数量,正常有 30 个以上 cab。如果用的是第三方精简版镜像,sxs 可能被删过,换官方原版 ISO。我遇到过用某修改版镜像,sxs 里只有 5 个文件,怎么装都失败,换回原版一次过。
4.3 现象:安装成功但程序仍提示缺少 .NET 3.5
原因:只装了 64 位组件,32 位程序需要 32 位组件。Server 2012 的 NetFx3 功能默认包含两者,但某些情况下/All没生效。解决:先禁用再重新启用:
# 先禁用功能 dism /online /disable-feature /featurename:NetFx3 # 再重新启用,确保 /All 参数生效 dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sxs /LimitAccess禁用后可能需要重启,再启用。重启前确认没有其他业务在跑。
4.4 现象:DISM 执行到 20% 卡住不动
原因:Windows Update 服务仍在后台尝试联网,或者 sxs 目录在慢速网络盘上。解决:按 2.3 停掉 wuauserv 服务,把 sxs 复制到本地 SSD 或高速磁盘。如果卡住超过 10 分钟,直接 Ctrl+C 中断,检查日志后重试。中断不会损坏系统,但可能留下临时文件,重启一次再装更稳。
4.5 现象:提示“功能名称未知”或“找不到功能”
原因:功能名拼写错误,或者系统不是 Server 2012。解决:确认命令里是NetFx3而不是NetFramework3或NET35。在 Server 2012 上,dism /online /get-features | findstr NetFx可以列出所有相关功能名,复制粘贴最保险。
5. 装完怎么验证跑通:三个动作确认 .NET 3.5 真正可用
5.1 用 DISM 和注册表双重确认功能状态
DISM 显示 Enabled 只是第一步,我还会查注册表确认版本号:
# 查询 .NET 3.5 的注册表版本值 reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" /v Version正常输出Version REG_SZ 3.5.30729.4926之类的值。如果提示找不到项,说明注册表没写入,功能没真正启用。再查 32 位视图:
# 64 位系统上查 32 位注册表视图 reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\NET Framework Setup\NDP\v3.5" /v Version两个都有值才算完整。这一步能发现那种“DISM 说成功但程序跑不起来”的假成功。
5.2 跑一个最小 .NET 3.5 程序做冒烟测试
最直接的办法是编译一个用 .NET 3.5 目标框架的控制台程序。在服务器上打开csc.exe(路径在C:\Windows\Microsoft.NET\Framework\v3.5\),写个一行代码:
# 进入 .NET 3.5 编译器目录 cd C:\Windows\Microsoft.NET\Framework\v3.5 # 编译一个最简单的控制台程序 csc.exe /target:exe /out:test35.exe test35.cstest35.cs内容就一句class P { static void Main() { System.Console.WriteLine("OK"); } }。编译成功并运行出 OK,说明 .NET 3.5 运行时和编译器都正常。如果csc.exe不存在,说明 Framework 目录没装全,回到第 3 章重新启用功能。
5.3 检查 Windows 功能列表和事件日志
最后在服务器管理器里刷新“添加角色和功能”列表,确认“.NET Framework 3.5 功能”显示为已安装。同时看事件查看器的 Windows 日志 → 应用程序,筛选来源.NET Runtime,没有红色错误即可。我一般会把dism /online /get-features | findstr NetFx3的输出截图存档,方便下次对比。从那以后我每次装 .NET 3.5 都强制走一遍“DISM 状态 → 注册表版本 → 冒烟编译”三步,再也没被假成功坑过。希望帮到你。
本文还有配套的精品资源,点击获取