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>
但它从未正确评估过。无论注册表项是否存在,安装都会随消息一起停止。所以我的问题是:
在进一步测试时,我发现MSMQ_INSTALLED属性包含值“1:0 2:”,无论我搜索的注册表项是现有的还是假的。
编辑:Condition元素存在于Product元素中;这是一个重要的区别as the Condition element is overloaded。
编辑:修改条件以使用CDATA指令,并反转内部条件逻辑,以更准确地反映问题。
答案 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”检查注册表值中找到的任何字符串。