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>
但是它从来没有正确地求值。无论注册表项是否存在,安装都会停止并显示该消息。所以我的问题是:
- 我是否正确使用了Condition元素?
- 我在评估中错误定义了什么?
在进一步的测试中,我发现MSMQ_INSTALLED属性包含值" 1:0 2:",无论我搜索的注册表项是存在的还是假的。
EDIT: Condition元素存在于Product元素中;这是一个重要的区别,因为Condition元素是重载的。
EDIT:修改条件使用CDATA指令,并反转内部条件逻辑,以更准确地反映问题
嗯,答案一直都是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"检查注册表值中是否有字符串