WiX条件适用于MSI,但不适用于Bundle

时间:2016-11-17 15:30:08

标签: wix windows-installer bundle

当我构建我的MSI文件,并且我使用基本条件时,预期会发生。例如,让我们说我在设置文件中有这个:

<Property Id="myProperty" Value="0"/>
<Condition Message="Value of myProperty is [myProperty], and it should be 1.">
    <![CDATA[Installed OR myProperty = "1"]]>
</Condition>

如果我构建它并运行MSI文件,它可以工作 - 也就是说,它会显示错误消息并退出。

Working condition when running MSI

但是,如果我将MSI放入Bundle中,它就不起作用了。也就是说,当我把它放入我的Bootstrapper时(&#34;属性&#34;下面是我的安装项目的名称 - 坏名字,我意识到):

    <Chain>
       <MsiPackage SourceFile="$(var.Properties.TargetPath)"/>
    </Chain>

然后我运行安装文件,我收到一个错误。安装开始时,它检查条件,给我预期的消息框(与上面相同),然后我收到此错误消息:

Setup Failed

查看日志,我收到三条错误消息:

Error 0x80070643: Failed to install MSI package. 
Error 0x80070643: Failed to execute MSI package. 
Error 0x80070643: Failed to configure per-machine MSI package.

使用退出代码:

Exit code: 0x643, restarting: No

我是WiX的这样一个菜鸟,我甚至不确定如何研究问题所在 - 我甚至无法提出一个明智的问题。因此,我向你们伸出援助之手!

(我使用的是WiX 3.10和Visual Studio 2015)

编辑:

感谢您回复我!我尝试了你的建议:

在安装程序文件中,我将该属性设为公开,并确保其安全。我保持相同的条件,因为我不认为我应该在这里获得价值而不是在引导程序中,我把财产的价值留下了。这是我为属性/条件所做的代码:

<Property Id="MY_PROPERTY" Secure="yes"/>
<Condition Message="MY_PROPERTY is [MY_PROPERTY].  Should be 1">
    <![CDATA[Installed OR MY_PROPERTY = "1"]]>
</Condition>

然后,在boostrapper文件中,我添加了一个子元素并给它一个值:

<MsiPackage SourceFile="$(var.LCondErrorInstaller.TargetPath)">
    <MsiProperty Name="MY_PROPERTY" Value="0"/>
</MsiPackage>

当我运行它时,我得到了与之前几乎相同的行为,除了一个区别 - 当我收到错误消息时。这一次,我得到弹出屏幕,其中包含Message条件和我之前所做的相同错误消息(参见&#34;安装失败&#34;上面),除了这次我在安装后不久发生,让我觉得这个条件实际上是在引导程序中触发的。

就日志文件而言,它们看起来是一样的(我不知道如何在运行Burn文件时获取MSI的日志文件,我现在所做的只是运行带有标记的& #34; / l&#34;,如下所示:&gt; file.exe / l logFile.log )。

为清楚起见,以下是日志文件中看起来很重要的部分:

    Error 0x80070643: Failed to install MSI package.
    Error 0x80070643: Failed to execute MSI package.
    Error 0x80070643: Failed to configure per-machine MSI package.
    ...
    Exit code: 0x643, restarting: No

当我最初询问我正在寻找什么样的行为时,我应该更加具体......

我将不仅仅是Burn文件中的那个MSI文件。我想要做的是:当安装Burn文件时,如果其中一个MSI文件中存在一个未满足的条件,我希望不安装该MSI文件,和其余的MSI要安装。我并不关心用户界面。

如果还有其他方法可以做到这一点,我全心全意。

1 个答案:

答案 0 :(得分:2)

如果您在MSI中具有启动条件,则可以将这些启动条件复制或移动到引导程序包本身中以停止此类行为。

启动条件失败返回致命错误1603(十六进制为0x643),这是由于启动条件未满足而导致引导程序启动的MSI失败时我所期望的。

您应该在msi的日志

中看到类似的内容
Action ended 17:33:38: LaunchConditions. Return value 3.
MSI (c) (08:4C) [17:33:38:610]: Doing action: FatalError
Action 17:33:38: FatalError. 
Action start 17:33:38: FatalError.
...
MSI (c) (08:4C) [17:33:41:188]: MainEngineThread is returning 1603

<小时/>

详细说明,您必须将msi包定义更改为以下内容才能使其通过引导程序正常运行

<Chain>
   <MsiPackage SourceFile="$(var.Properties.TargetPath)">
      <MsiProperty Name="MYPROPERTY" Value="1"/>
   </MsiPackage>
</Chain>

此外,如果您要将属性从引导程序传递到MSI,则属性必须是公共属性,该属性的名称为ALL CAPS。

如果要在msi的安装阶段的某处使用此属性,则还必须将此属性标记为安全。