1

类似的帖子在这里,但我无法让我的工作 WiX Bundle bal:condition - util:RegistrySearch 变量始终为 false

先生,我正在努力让这个确切的东西正常工作。“版本”在注册表项不存在时设置为 0,在存在键时设置为 1。无论哪种情况,我的捆绑包仍然会被安装。

我正在使用 VS 2015 和 Wix 3.10。请你帮忙。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
 xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">  
 <Bundle Name="XXX"
      Version="XXX"
      Manufacturer="XXX"
      UpgradeCode="XXX"
      IconSourceFile="XXX"
      Copyright="XXX" >

<util:RegistrySearchRef Id='SearchForMyIns' />

<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
  ...
</BootstrapperApplicationRef>

<Chain>
  <PackageGroupRef Id='NetFx40Web' />

  <MsiPackage SourceFile="$(var.DummyInstaller.TargetDir)\DummyInstaller.msi"  DisplayName="Dummy Conditioning" />      
</Chain>
</Bundle>

<Fragment>
<util:RegistrySearch
      Id='SearchForMyInst'
      Variable="Version"
      Result="exists"
      Root="HKLM"
      Key="SOFTWARE\MyInst" 
      Win64="yes" />
<bal:Condition Message="ThirdParty Application Required.">Version</bal:Condition>
</Fragment>

</Wix>
4

2 回答 2

1

Bal:Condition 不会评估您是否正在使用 MBA。检查以下链接

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Wix-Burn-Bundle-condition-does-not-work-if-using-MBA-td7581757.html

改变

<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">

<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">

你会看到 Bal:Condition 工作

于 2016-12-20T16:54:42.523 回答
0

总是为您安装的原因是

<bal:Condition Message="messagehere">Version</bal:Condition>

将评估 Version 的存在而不是 Version 的值。由于您的注册表搜索已存在,因此始终定义版本,因此条件始终通过。(我相信这是因为所有注册表搜索变量都是隐式字符串变量)

如果您添加“版本 = 1”,那么您的安装应该仅在您的注册表搜索确实找到您要查找的内容时继续。

我还想指出这种情况的一个特别令人讨厌的陷阱。如果用户安装了您的捆绑包,然后决定他们不再需要您的捆绑包第三方程序并且他们同时卸载它们但他们首先卸载了第三方程序,会发生什么情况?

您的安装程序将无法卸载,因为当它尝试运行时,每次都会失败 bal:Condition,因为系统上不再存在第三方程序。

要解决此问题,您应该将“OR WixBundleInstalled”添加到您的 bal:Condition 中。

于 2016-11-11T16:02:42.657 回答