启动条件阻止静默安装(Application + .Net Framework)

时间:2017-09-27 11:51:56

标签: c# visual-studio setup-project setup-deployment

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

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

  

此设置需要.NET Framework版本VersionNumber。请安装.NET Framework并再次运行此安装程序。 .NET Framework可以从Web获得。你现在想这样做吗?

当然我不想这样做。这应该会自动生效。

所以我在Setup Deployment Project (right click) => Properties => Prerequisites...中选择了框架,检查了&#34;从与我的应用程序相同的位置下载先决条件&#34; 并将NDP451-KB2858728-x86-x64-AllOS-ENU.exe添加到目录{ {1}}。

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

当然,我可以编写一个bash脚本,如果需要,可以静默安装 .Net Framework ,最后启动我的应用程序的静默安装。但我想实现这个&#34;正确的方式&#34; 。我觉得我错过了 东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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引导程序工具&#34; Burn&#34;创建一个包将安装框架然后你的MSI静默。它基本上是一个Xml驱动的依赖项规范和你的MSI文件。

答案 1 :(得分:0)

向PhilDW致以明确这个话题。很高兴知道使用msi文件是不可能的。我已经阅读了关于WiX引导程序工具“Burn”和Bootstrap Manifest Generator的内容,并得出结论写一个简单的批处理文件。这将检测是否安装了.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 Framework的最小版本密钥编号进行比较。您可以在此处找到这些可能值的列表: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