使用 WixUI_InstallMode 属性,我遇到了 WIX 安装程序条件的非常奇怪的行为。它在元素条件和元素条件下表现完全不同。例如,只有在使用删除或修复选项时,此条件才会正确导致 MaintenanceTypeDlg:
<UI>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="6"><![CDATA[WixUI_InstallMode = "Repair" OR WixUI_InstallMode = "Remove"]]></Publish>
</UI>
而这个从不显示上一个对话框:
<UI>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="6"><![CDATA[WixUI_InstallMode = Repair OR WixUI_InstallMode = Remove]]></Publish>
</UI>
唯一的区别是第二个示例中的“Repair”和“Remove”值不带引号。所以它看起来很正常,我们应该将值放在引号中,就像在 WIX 源中一样。
但是让我们再考虑两个例子:
<InstallExecuteSequence>
<Custom Action="AssertUserCredentials" After="InstallValidate"><![CDATA[WixUI_InstallMode<>"Remove"]]></Custom>
</InstallExecuteSequence>
这个条件总是成立的。所以在删除模式下,自定义操作被触发,这是完全出乎意料的。为什么会被解雇?
又是一个不带引号的例子:
<InstallExecuteSequence>
<Custom Action="AssertUserCredentials" After="InstallValidate"><![CDATA[WixUI_InstallMode<>Remove]]></Custom>
</InstallExecuteSequence>
这现在可以在没有引号的情况下正常工作,并且不会在卸载模式下执行自定义操作。
对我来说,这两种条件的用法是完全一样的逻辑,但行为却完全相反。谁能解释会发生什么?