如果已安装,请跳过MSI

时间:2017-07-24 09:39:30

标签: wix windows-installer wix3.5 wix3 wix3.7

我有一个WIX安装程序,我在其中安装我的程序和.NET Core 1.0.5。 .NET Core以静默方式安装:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" />

在干净的系统上,安装程序就可以了。如果我尝试重新安装它,我会重新启动。可能已检测到.NET安装程序已安装并自行触发修复功能。如果已经安装了.NET Core安装,有没有办法跳过它?

我尝试寻找命令行参数,但似乎没什么用处

2 个答案:

答案 0 :(得分:3)

ExePackage元素具有 DetectCondition 属性。这意味着您可以指定一个条件,如果条件的计算结果为false,则将安装包。您可以将其与util:RegistrySearch元素结合使用,该元素可用于搜索注册表以检测是否已安装.NET Core。

为了执行注册表搜索,您首先需要找到安装.NET时存在的注册表项。

找到“HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \”, (或64位计算机上的“HKLM \ SOFTWARE \ WOW6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \”)键在您的注册表中,然后找到与.NET Core对应的子项 - 此键应具有“DisplayName”的值“应该是”.NET Core“或类似的东西。

找到正确的密钥后,其名称应为十六进制字符串 - 这是与.NET Core程序对应的GUID之一。然后,您可以使用以下代码来允许安装程序搜索此密钥的存在:

<util:RegistrySearch Id="VCRedistTest32" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YOUR_GUID_HERE}" Result="exists" Variable="DOTNETPresent" Win64="no"/>

(对于64位注册表使用Win64 =“yes”)

然后,您可以将以下内容用于ExePackage:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" DetectCondition="DOTNETPresent"/>

不要忘记将 util 扩展名的引用添加到顶级wix元素:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

答案 1 :(得分:2)

您需要使用DetectCondition属性和注册表搜索,以便在安装.net Core时分配属性。

ExePackage Element - DetectCondition

&#34;确定目标系统上是否存在包的条件。此条件可以使用内置变量和搜索返回的变量。这种情况是必要的,因为Windows没有提供检测ExePackage存在的方法。 Burn使用此条件来确定在捆绑操作期间如何处理此包;例如,如果此条件为false或省略并且正在安装捆绑包,则Burn将安装此包。&#34;