WiX:条件内部文本没有正确评估

时间:2011-08-11 03:30:02

标签: c# wix

WiX第一个计时器。

我正在使用WiX构建我的产品的安装程序,我正在尝试验证MSMQ已安装,然后继续安装this SO answer。我正在使用一个Condition元素,定义如下:

  <Condition Message="MSMQ must be installed in order to proceed.">
    <![CDATA[MSMQ_INSTALLED<>"false"]]>
  </Condition>

我的Property和RegistrySearch看起来像这样:

  <Property Id="MSMQ_INSTALLED" Value="false" Secure="yes">
    <RegistrySearch Id="Msmq.RS"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\MSMQ"
                    Name="Values"
                    Type="raw"/>
  </Property>

但它从未正确评估过。无论注册表项是否存在,安装都会随消息一起停止。所以我的问题是:

  1. 我正确使用Condition元素吗?
  2. 我在评估中错误定义了什么?
  3. 在进一步测试时,我发现MSMQ_INSTALLED属性包含值“1:0 2:”,无论我搜索的注册表项是现有的还是假的。

    编辑:Condition元素存在于Product元素中;这是一个重要的区别as the Condition element is overloaded

    编辑:修改条件以使用CDATA指令,并反转内部条件逻辑,以更准确地反映问题。

2 个答案:

答案 0 :(得分:1)

嗯,答案是was on SO the whole time。显然,WiX不支持搜索注册表项,因此我创建了一个自定义操作项目并使用二进制标记将其导入我的MSI,然后在安装期间在适当的位置运行自定义操作。就我而言,它发布在LaunchConditions之前。

供参考,代码为:

public class CustomActions
{
    [CustomAction]
    public static ActionResult CustomAction1(Session session)
    {
        session.Log("Begin CustomAction1");

        var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSMQ");
        session["MSMQ_INSTALLED"] = key == null ? "-1" : "1";

        return ActionResult.Success;

    }
}

(自定义操作项目中唯一的类)

<Binary Id="WixCustomAction" SourceFile="C:\work\RelayMed\src\dev\WixCustomAction\bin\Debug\WixCustomAction.CA.dll"/>
<CustomAction Id="CheckMsmq" BinaryKey="WixCustomAction" DllEntry="CustomAction1" Execute="immediate" Return="check"/>

(在产品节点下将Binary导入WiX。)

<InstallUISequence>
  <Custom Action="CheckMsmq"
          Before="LaunchConditions"/>
</InstallUISequence>

(在LaunchConditions之前运行自定义操作)

条件和财产与原始职位保持不变。 RegistrySearch已被完全删除。

编辑:注意删除了RegistrySearch代码。

答案 1 :(得分:0)

您的创作说“如果HKLM \ SOFTWARE \ Microsoft \ MSMQ @ Values的字面值为'false',则安装可以继续。”

只需使用“MSMQ_INSTALLED”检查注册表值中找到的任何字符串。