2017-09-27 196 views
0

我已经在Visual Studio 2013中为我的应用程序添加了一个安装部署项目,以便为我的应用程序生成安装向导,并生成一个Setup.msi -File用于提供静音安装。启动条件防止静默安装(Application + .Net Framework)

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

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

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

所以我选择的框架Setup Deployment Project (right click) => Properties => Prerequisites...,检查“下载前提条件从相同的位置,我的应用程序”并添加NDP451-KB2858728-x86-x64-AllOS-ENU.exe到目录C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper\Packages\DotNetFX451

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

当然,我可以编写一个bash脚本,在必要时默默安装.Net Framework,并最终启动我的应用程序的静默安装。但我想实现这个“正确的方式”。我有这种感觉,我错过了 的东西。

任何想法?

+0

我已经试过了图形化设置界面(SETUP.EXE)。在这里可以很好地工作(与用户交互):*安装.Net =>重新启动PC =>应用程序安装*。所以看起来我在Visual Studio中的配置是正确的。但是,我真的必须编写一个bash脚本来实现msi文件的无提示安装吗? – rweisse

回答

0

Thx to 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(4.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 
1

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

据我所知,setup.exe引导程序没有静默选项,但那是因为许多先决条件没有安静安装。曾经有一个工具(引导清单生成器),你可以用它来改变包含在命令行中嵌入的文件安装先决条件,使他们沉默:

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

,这样仍可能是一种选择。

另一种选择是使用WiX引导工具“Burn”创建一个捆绑软件,然后安装框架,然后默认安装MSI。它基本上是一个Xml驱动的依赖关系和你的MSI fil规范。

+0

谢谢!我会明天尝试,让你保持最新! – rweisse