WiX:条件内部文本没有正确计算

本文关键字:计算 文本 条件 内部 WiX | 更新日期: 2023-09-27 18:05:17

我是第一次来这里。

我正在使用WiX为我的产品构建一个安装程序,并且我试图在继续安装之前验证MSMQ是否已安装,请遵循此SO答案。我使用一个条件元素,定义如下:

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

我的属性和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. 我在评估中错误定义了什么?

在进一步的测试中,我发现MSMQ_INSTALLED属性包含值" 1:0 2:",无论我搜索的注册表项是存在的还是假的。

EDIT: Condition元素存在于Product元素中;这是一个重要的区别,因为Condition元素是重载的。

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

WiX:条件内部文本没有正确计算

嗯,答案一直都是SO。显然,WiX不支持搜索注册表项,因此我创建了一个Custom Actions项目,并使用Binary标记将其导入到我的MSI中,然后在安装期间在适当的位置运行Custom Action。在我的例子中,它是在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;
    }
}

(Custom Actions项目中唯一的类)

<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"/>

(将二进制文件导入WiX,在Product节点下)

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

(启动条件前自定义动作的运行)

条件和属性保持与原始帖子相同。RegistrySearch已被完全删除。

EDIT:注意删除RegistrySearch标签。

您的作者说"如果HKLM'SOFTWARE'Microsoft'MSMQ@Values的文字值为'false',则可以继续安装。"

使用"MSMQ_INSTALLED"检查注册表值中是否有字符串