简介:这份资源面向在 Windows Server 2012 R2 及云服务器环境中部署 .NET Framework 3.5 受阻的运维与开发人员,针对系统提示找不到源文件、要求通过“源”选项指定还原文件位置等典型报错,提供一套亲测有效的离线安装与修复方案。压缩包共 1568 个文件,约 99.19MB,以 720 个 dll 动态库、180 个 resx 资源文件、84 个 exe 可执行程序为主,并包含 aspx、config、sql、browser、ini、tlb、targets 等配置与组件文件,覆盖安装源、组件注册及服务配置等环节,便于直接挂载或指定为本地源使用。目前已有 10327 人学习下载,说明该方案在同类场景中认可度较高。读者可据此绕过在线源缺失限制,完成 .NET 3.5 功能还原,并为 SQL Server 等依赖组件的后续部署扫清环境障碍。
1. 一个叫 settled_.net3.5install.zip 的包,到底在解决什么麻烦
如果你在 Windows 上维护过老系统,一定见过这种场面:某台内网机器要跑一个十年前的业务程序,双击图标弹出一句“需要安装 .NET Framework 3.5”,点“安装此功能”又卡在下载进度条上转圈,最后报 0x800F0906 或者 0x800F081F。settled_.net3.5install.zip这类命名,本质上就是有人把“离线装 .NET 3.5”这件事打包成了一个可复用的方案——settled_是“已解决”的意思,.net3.5install是目标,.zip是载体。它要解决的不是“怎么下载”,而是“在没网、被策略限制、或者系统镜像里缺组件的机器上,怎么把 .NET 3.5 装进去”。适合谁?做企业内网运维的、给工厂老设备做维护的、以及被“程序 install and uninstall troubleshooter 修不好”折磨过的开发者。这一章先把这件事的边界说清楚,后面几章再拆具体怎么落地。
.NET 3.5 和现在的 .NET 8、.NET 9 不是一回事。它是 .NET Framework 的一个版本,和 Windows 组件深度绑定,安装方式走的是 DISM 或“启用 Windows 功能”那条路,而不是像 .NET Core 那样解压即用。所以settled_.net3.5install.zip里通常不会是一个 exe 安装器,而是一份sxs文件夹或者一份microsoft-windows-netfx3-ondemand-package的 cab 包,配合一个批处理脚本。热词里频繁出现的“怎么查 net 运行库”“microsoft .net packages aio”,其实都指向同一个需求:先确认机器上到底有没有、缺哪个版本,再决定装什么。这一章不写命令,只把“为什么需要这个 zip”讲透,下一章开始动手。
2. 先搞清楚 .NET 3.5 的安装机制:为什么不能直接双击 exe
2.1 按需功能(On-Demand)和离线源的关系
Windows 8 以后,.NET 3.5 被定义为“按需功能”(Feature on Demand)。系统镜像里默认只放一个占位符,真正的二进制文件放在sxs目录或者独立的 cab 包里。当你点“启用 .NET Framework 3.5”时,系统会去 Windows Update 拉取对应版本的组件。问题就出在这里:内网机器连不上 Windows Update,或者组策略把这条通道关了,于是安装失败。settled_.net3.5install.zip的核心价值,就是把那个“离线源”提前准备好,让 DISM 从本地路径取文件,而不是走网络。
常见做法是:从同版本 Windows 的安装 ISO 里提取sources\sxs文件夹,或者直接下载microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~amd64~~.cab。注意,cab 包的架构必须和系统一致,x64 系统装 x86 的包会报错。热词里“需要 vmware install disk 上的文件.dll”也是类似逻辑——安装程序在找源文件,找不到就报缺文件。
2.2 用 DISM 挂载离线源的最小命令
假设你已经把sxs文件夹放到了D:\sxs,以管理员身份打开 CMD 或 PowerShell,执行:
dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sxs /LimitAccess这条命令的含义逐段拆:/online表示操作当前运行的系统,不是离线镜像;/featurename:NetFx3是 .NET 3.5 的功能名,注意不是 NetFx35;/All会一并启用父功能;/Source:D:\sxs指定本地源路径;/LimitAccess是关键,它阻止 DISM 回退到 Windows Update,强制只用本地源。少了/LimitAccess,DISM 可能仍然尝试联网,然后超时失败。
参数说明:/Source路径下必须有sxs子目录结构,直接指向sxs文件夹本身,不要指到 cab 文件。如果报“源文件找不到”,先确认路径里有没有microsoft-windows-netfx3-ondemand-package.cab。执行成功后,用dism /online /get-featureinfo /featurename:NetFx3查看状态,State 显示 Enabled 才算真正装上。
2.3 从 zip 到可用源的整理步骤
拿到settled_.net3.5install.zip后,不要直接双击里面的 exe。先解压到一个短路径,比如D:\net35,避免中文路径和空格。然后检查目录结构,通常会有sxs文件夹和install.bat。如果没有sxs,只有 cab 文件,需要手动建一个sxs文件夹把 cab 放进去。接着用管理员权限运行脚本,或者手动执行上面的 DISM 命令。这一步的坑在于:很多人解压到桌面,路径带用户名中文,DISM 读源时直接报 0x800f081f,查半天以为是包坏了,其实是路径问题。
提示:如果系统是 Windows 7 或更早版本,DISM 的
/online参数不支持,需要用dism /image挂载或者直接运行NetFx35.exe,这是另一套流程,别混用。
3. 在 Windows 10/11 上复现:从解压到验证的完整链路
3.1 确认系统版本和已有运行库
动手前先查清楚现状,避免白装。打开 PowerShell,执行:
Get-WindowsOptionalFeature -Online -FeatureName NetFx3输出里 State 如果是 Disabled,说明没装;如果是 Enabled,说明已经装了,不用再折腾。再看注册表确认版本:
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" /v Install返回Install REG_DWORD 0x1表示已安装。热词里“怎么查 net 运行库”问的就是这一步。如果机器上同时有 .NET 4.x,不冲突,3.5 和 4.x 是并行共存的,各自独立。
3.2 解压 zip 并定位 sxs 源
用资源管理器右键解压,或者用命令行:
tar -xf settled_.net3.5install.zip -C D:\net35Windows 10 1803 以后自带tar,能解 zip。解压后dir D:\net35看内容。正常应该看到sxs文件夹,里面至少有一个 cab 文件,大小在 100MB 上下。如果只有几十 KB,说明是占位符,不是完整包,装了也会失败。这一步的验证方法:右键 cab 文件看属性,数字签名里应该有 Microsoft 字样。
3.3 执行安装并处理常见返回码
管理员 CMD 里跑:
dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\net35\sxs /LimitAccess返回码含义:0x800F0906 表示源文件缺失或版本不匹配;0x800F081F 表示找不到源路径;0x800F0922 通常是系统保留分区空间不足。遇到 0x800F0906,先核对 cab 包版本和系统 build 号是否对应,比如 22H2 的包不能用在 21H2 上。遇到 0x800F081F,检查路径拼写和权限,用dir D:\net35\sxs确认文件真的在。
安装完成后重启一次,然后跑一个依赖 .NET 3.5 的老程序验证。如果程序能正常启动,说明链路通了。如果还报错,用Get-WindowsOptionalFeature再看一次状态,确认不是被组策略回滚。
3.4 用批处理把流程固化下来
手动敲命令容易漏参数,建议把逻辑写进install.bat:
@echo off set SXS=%~dp0sxs if not exist "%SXS%" ( echo 找不到 sxs 文件夹,请确认解压完整 exit /b 1 ) dism /online /enable-feature /featurename:NetFx3 /All /Source:"%SXS%" /LimitAccess if %errorlevel% neq 0 ( echo 安装失败,错误码 %errorlevel% exit /b %errorlevel% ) echo 安装完成,建议重启%~dp0取脚本所在目录,这样不管解压到哪都能找到sxs。errorlevel判断让失败时能立刻看到返回码,不用去翻日志。这个脚本适合放进settled_.net3.5install.zip里作为默认入口,比让用户手动敲命令靠谱得多。
4. 避坑与排查:装 .NET 3.5 时最容易翻车的 5 个点
4.1 现象:报 0x800F0906,提示“源文件找不到”
原因:cab 包版本和系统 build 不匹配,或者sxs文件夹里放的是 x86 包而系统是 x64。解决:用winver查系统版本,去对应 ISO 里提取sxs,别从别的机器随便拷。x64 系统必须用 amd64 的 cab。
4.2 现象:DISM 卡在 20% 很久然后失败
原因:/LimitAccess没加,DISM 在尝试联网,但网络被墙或者 WSUS 策略拦截。解决:确认命令里有/LimitAccess,并且组策略里“指定 Windows 更新源位置”没有强制指向一个不可达的服务器。
4.3 现象:安装成功但程序仍报“需要 .NET 3.5”
原因:程序是 32 位的,但只装了 64 位组件,或者程序清单要求的是 3.5 SP1 而装的是 RTM。解决:用corflags查程序位数,确认sxs里同时包含 x86 和 x64 的 cab,或者直接装完整版NetFx35.exe。
4.4 现象:解压后运行脚本一闪而过
原因:脚本没有以管理员权限运行,DISM 直接拒绝。解决:右键install.bat选“以管理员身份运行”,或者在脚本开头加net session >nul 2>&1 || (echo 请用管理员运行 & pause & exit)。
4.5 现象:装完后系统更新又把它卸了
原因:某些企业 WSUS 策略会把 .NET 3.5 标记为“不需要”并回滚。解决:在组策略里把 NetFx3 加入例外,或者用dism /online /disable-feature先关再开,强制刷新状态。这个坑最隐蔽,血泪经验是装完先跑一周再交付。
5. 进阶:把离线包做成可复用镜像和自动化检测
5.1 用 cab 包自制精简版 sxs 源
如果你手头只有 cab 文件,没有完整 ISO,可以自己搭sxs结构。建一个文件夹D:\net35\sxs,把microsoft-windows-netfx3-ondemand-package~31bf3856ad364e35~amd64~~.cab放进去,DISM 就能识别。注意文件名里的架构标识不能改,改了 DISM 不认。这个方法的局限是只适用于同 build 的系统,跨版本会报 0x800F0906。
5.2 用 PowerShell 做批量检测和安装
内网机器多的时候,一台台手动装不现实。写一个检测脚本:
$feature = Get-WindowsOptionalFeature -Online -FeatureName NetFx3 if ($feature.State -ne 'Enabled') { Write-Host "未安装,开始离线安装" dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\net35\sxs /LimitAccess } else { Write-Host "已安装,跳过" }这个脚本可以配合远程执行工具批量推。关键点是Get-WindowsOptionalFeature在 PowerShell 5.1 里就能用,不需要额外模块。如果返回 State 是EnablePending,说明有挂起的重启,先重启再装。
5.3 验证安装是否真正生效的三种方法
第一种,查注册表HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5的 Install 值。第二种,跑dism /online /get-featureinfo /featurename:NetFx3看 State。第三种,最实在的,找一个依赖 .NET 3.5 的 exe 直接双击,能起来就是真的好了。三种方法结果不一致时,以第三种为准,因为前两种可能被策略欺骗。
5.4 一个我常用的习惯
每次交付前,我会在虚拟机里先跑一遍完整流程:全新系统、断网、解压 zip、执行脚本、重启、验证。只有虚拟机里过了,才敢推到生产。这个习惯帮我挡掉过至少三次“路径带中文导致 DISM 失败”的问题。settled_.net3.5install.zip这种包,价值不在文件本身,而在它背后那条被验证过的路径。希望帮到你。
本文还有配套的精品资源,点击获取