.NET Framework4.8.1为前置条件时应用安装失败的解决方案咨询
.NET Framework 4.8.1安装重启导致Wix安装链失败的解决方案
现有配置说明
1. Bundle的Chain配置
<PackageGroupRef Id="NetFx481Web" /> <PackageGroupRef Id="VcRedist2015x64"/> <MsiPackage SourceFile="$(var.Toolbox.TargetPath)"> <MsiProperty Name="INSTALLEXAMINERDESKTOPSHORTCUT" Value="[HasDesktopShortcut]"/> <MsiProperty Name="INSTALLEXAMINERFILEASSOCIATION" Value="[CreateFileAssocition]"/> <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]" /> </MsiPackage>
2. NetFx481Web的ExePackage配置
InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html"" RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html"" UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html"" PerMachine="yes" DetectCondition="!(wix.NetFx481WebDetectCondition)" InstallCondition="!(wix.NetFx481WebInstallCondition)" Id="NetFx481Web" Vital="yes" Permanent="yes" Protocol="netfx4" DownloadUrl="$(var.NetFx481WebLink)" LogPathVariable="NetFx481WebLog" Compressed="no" Name="!(wix.NetFx481WebPackageDirectory)ndp481-web.exe"
3. RemotePayload配置
<RemotePayload CertificatePublicKey="51E8CCBFA002A22CB64E5CD25F42FE7BFAA920F6" CertificateThumbprint="72105B6D5F370B62FD5C82F1512F7AD7DEE5F2C0" ProductName="Microsoft .NET Framework 4.8.1" Description="Microsoft .NET Framework 4.8.1 Setup" Hash="22C974F3865CCE3F0EC385DD9C0B291CA045BC2C" Size="1466664" Version="4.8.9195.10" />
4. 产品Condition配置
<Condition Message="This application requires .NET Framework version 4.8.1 to run. Please see the Release Notes for instructions on how to install the .NET Framework."> <![CDATA[Installed OR (NETFRAMEWORK45 >= "#533320")]]> </Condition>
问题核心
.NET Framework 4.8.1安装完成后需系统重启生效,但ExePackage配置中使用/norestart参数抑制了重启,导致后续MSI包因.NET未完全生效而安装失败(错误码0x80070643)。重启后重新运行安装包可成功,但移除MSI的.NET检测Condition会导致应用在重启前无法运行。
可行解决方案
方案1:让Bundle自动处理重启与安装续跑
修改.NET安装包的命令参数,移除重启抑制,同时配置Bundle的重启策略,实现安装链自动重启并恢复流程:
- 调整NetFx481Web的命令参数,删除
/norestart:
InstallCommand="/q /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html"" RepairCommand="/q /repair /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html"" UninstallCommand="/uninstall /q /ChainingPackage "[WixBundleName]" /log "[NetFx481WebLog].html""
- 在Bundle节点中添加重启触发与续跑配置:
<Bundle ...> <!-- 提示用户需要重启 --> <RestartPrompt Suppress="no" /> <!-- 当检测到待重启状态时,触发重启并在重启后继续安装 --> <PlanAction After="Install" Action="Restart" When="PendingReboot" /> <!-- 原有配置 --> </Bundle>
此方案会在.NET安装后自动提示用户重启,重启完成后自动继续安装VC Redist和MSI包,既保证.NET生效,又无需用户手动重新启动安装程序。
方案2:调整MSI Condition,兼容待重启状态
若需保留/norestart参数,可修改MSI的Condition逻辑,允许在.NET已安装但系统待重启时完成安装,同时在安装结束后提示用户重启:
- 更新MSI的Condition,加入待重启状态检测:
<Condition Message="This application requires .NET Framework version 4.8.1 to run. Please install it first, or restart your computer if you've already installed it and try again."> <![CDATA[Installed OR (NETFRAMEWORK45 >= "#533320") OR PENDINGREBOOT]]> </Condition>
- 在Bundle中添加安装完成后的重启提示:
<Bundle ...> <ExitAction Condition="PendingReboot" Message="A system restart is required to activate the .NET Framework. Please restart your computer before launching the application." /> <!-- 原有配置 --> </Bundle>
此方案允许安装流程完整结束,但会强制提示用户必须重启才能运行应用,避免安装失败的同时保留原有重启抑制逻辑。
方案3:替换为.NET离线安装包
Web安装包依赖在线下载,重启逻辑更严格,换成.NET Framework 4.8.1的完整离线安装包,可减少重启需求或更稳定处理重启:
- 替换ExePackage的
Name和DownloadUrl为离线包的路径/下载链接 - 更新RemotePayload的
Hash、Size、Version为对应离线包的属性 - 调整安装命令参数(离线包的静默安装参数通常为
/q /norestart,但重启触发逻辑更可控)
内容的提问来源于stack exchange,提问作者Djomla




