我们已为我们的应用程序创建了WIX安装程序。我们面临的问题是: 我们已经定义了两个不同的自定义操作(比如ActionForInstall和ActionForUninstall),我们希望在以下情况下执行: ActionForInstall:应该在安装,产品升级,维护模式下运行(用于修复和修改) ActionForUninstall:只应该在卸载时运行。
但我们无法设定适当的条件。你可以参考代码:
<Custom Action=ActionForInstall After='InstallFinalize' >
(NOT Installed) OR (Installed AND ((MaintenanceMode = "Modify") OR (MaintenanceMode = "Repair")) AND (NOT (MaintenanceMode = "Remove"))) OR ((UPGRADINGPRODUCTCODE) AND NOT(REMOVE ~= "ALL"))
</Custom>
<Custom Action=ActionForUninstall Before='InstallFinalize'>
Installed AND NOT UPGRADINGPRODUCTCODE
</Custom>
请告诉我们我们做错了什么。上面的代码即使是卸载也会调用InstallFinalize。
答案 0 :(得分:10)
您可以尝试以下条件:
ActionForInstall:
REMOVE <> "ALL"
ActionForUninstall
REMOVE = "ALL"
答案 1 :(得分:5)
通常使用产品级属性(如未安装和REMOVE =“ALL”)的条件不符合您的预期。通常最好使用组件操作状态,例如
$ COMPONENTNAME = 3&lt; - 正在本地安装的组件
$ COMPONENTNAME = 2&lt; - 组件先前已安装,现在正在删除
这通常涵盖您的所有安装,卸载,维护,修复和升级方案。
您可以使用“&amp;”为功能执行类似的操作运算符,但通常使用组件“$”更好,因为组件是物理的,并且可以与一个或多个仅合乎逻辑的功能相关联。
如果你真的想把它提升到一个新的水平,你的自定义动作可以(应该)使用外键连接到Component表来进行数据驱动。在这种情况下,您的自定义操作始终会触发,然后查询表并评估组件操作状态,以确定需要安排哪些操作。