启动条件防止静默安装(应用程序 + .Net Framework)

Launch condition prevents silent installation (Application + .Net Framework)

我在 Visual Studio 2013 年向我的应用程序添加了一个安装部署项目,以便为我的应用程序生成一个安装向导,并为我的应用程序生成一个 Setup.msi-文件提供静默安装。

执行 msiexec /i "<PathToSetupDirectory>\Setup.msi" /qb! 按预期工作。我的应用程序是静默安装的。但我的 C#-Application 依赖于 .Net-Framework 4.5.1。如果未安装,则会引发启动条件:

This setup requires the .NET Framework version VersionNumber. Please install the .NET Framework and run this setup again. The .NET Framework can be obtained from the Web. Would you like to do this now?

我当然不会喜欢这样做。这应该会自动工作。

所以我选择了Setup Deployment Project (right click) => Properties => Prerequisites...中的框架,勾选了"Download Prerequisites from the same location as my application",将NDP451-KB2858728-x86-x64-AllOS-ENU.exe添加到了C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper\Packages\DotNetFX451目录下。

我希望 Setup.msi 在框架尚未安装的情况下不显示启动条件的消息。它应该只安装 .Net Framework 和应用程序后记,无需任何用户交互。但它仍然出现。按 No 会导致退出安装。按 会打开浏览器并退出安装。

当然,我可以编写一个 bash 脚本,在必要时静默安装 .Net Framework,并最终开始静默安装我的应用程序。但是我想实现这个"the right way"。我有种错过的感觉 东西。

有什么想法吗?

MSI 安装无法同时安装 .NET Framework,主要是因为 MSI 安装程序无法递归安装另一个 MSI 安装程序(NET FW)。这是必须在 MSI 文件之前安装许多先决条件的原因之一,VS 安装程序为此使用 setup.exe。

据我所知,setup.exe 引导程序没有静默选项,但那是因为许多先决条件没有静默安装。曾经有一个工具(Bootstrap Manifest Generator),您可以使用它来更改包含命令行安装的嵌入式文件,以使其成为静默的先决条件:

https://msdn.microsoft.com/en-us/library/ms165429.aspx

所以这可能仍然是一个选择。

另一种选择是使用 WiX 引导程序工具 "Burn" 创建一个包,该包将安装框架,然后静默安装 MSI。它基本上是一个 Xml 驱动的依赖项规范和您的 MSI 文件。

感谢 PhilDW 阐明了这个主题。很高兴知道这对于 msi 文件是不可能的。我已经阅读了 WiX 引导程序工具 "Burn" 和 Bootstrap 清单生成器,并得出编写一个简单的批处理文件的结论。这将检测是否安装了 .Net Framework 版本 4.5.1 或更高版本 - 如果没有安装它会自动安装。之后静默 msi-install 开始。

silent_install.cmd:

@echo off
set forceNetFrameworkInstall=true

echo Starting silent installation of Setup.msi and its prerequisites ...

REG QUERY "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release
if %ERRORLEVEL% EQU 0 (goto CHECK) else (goto INSTALL_DOTNET)

:CHECK
for /f "tokens=2*" %%a in ('REG QUERY "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release') do set "releaseKeyHex=%%b"
set /A releaseKeyDec=%releaseKeyHex%
if %releaseKeyDec% GEQ 378675 set forceNetFrameworkInstall=false
if %forceNetFrameworkInstall% == true (
    echo Prerequisite: .Net Framework 4.5.1 or later version not detected
    goto INSTALL_DOTNET
) else (
    echo .Net Framework 4.5.1 or later version detected
    goto INSTALL_APP
)

:INSTALL_DOTNET
echo Installing .Net Framework 4.5.1 ...
%~dp0\DotNetFX451\NDP451-KB2858728-x86-x64-AllOS-ENU.exe /passive /norestart
echo Installing .Net Framework 4.5.1 Language Pack (German) ...
%~dp0\DotNetFX451\NDP451-KB2858728-x86-x64-AllOS-DEU.exe /passive /norestart
goto INSTALL_APP

:INSTALL_APP
echo Installing Application ...
msiexec /i %~dp0\Setup.msi /qb!
exit

此脚本读取当前安装的 .Net Framework (v4.X) 的十六进制发布密钥并将此密钥解析为十进制数并将其与首选 .Net 框架。您将在此处找到这些可能值的列表:Detecting the .NET Framework (值越大.Net Framework 版本越高)。

脚本应位于以下目录树中:

|- setup.exe
|- Setup.msi
|- silent_install.cmd
|+ DotNetFX451
   |- NDP451-KB2858728-x86-x64-AllOS-DEU.exe
   |- NDP451-KB2858728-x86-x64-AllOS-ENU.exe