我想知道是否可以从自定义操作中手动运行RemoveFolderEx元素。我猜可能不是,但有人可能知道一种我不知道的方式。
我的问题是我想运行RemoveFolderEx元素,但仅在真正的UNINSTALL上运行,但是我的程序在升级时执行它,因为我在重新安装之前将其设置为uninstall。
我通过这种方法尝试过 Wix: condition on property not working 但它在重新安装时无法正常运行。
我唯一能想到的是能够从自定义操作中手动设置RemoveFolderEx,我知道我在正确的位置运行并且仅在真正的卸载时运行。也许我的自定义操作可以使用c ++ dll,然后手动将命令添加到MSI接口,但如果我走得那么远,也可以自己完全编写删除逻辑。
感谢。尼尔
编辑:我终于有了这个工作,这里有一些示例wix来展示我的所作所为。
<Property Id='P.REMOVEDATAFOLDER' Secure='yes' />
<DirectoryRef Id="DATADIR">
<Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
<util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" />
</Component>
</DirectoryRef>
<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' />
<InstallExecuteSequence>
<Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>
在从注册表中读取DATADIR但在CostInitialize操作之前,属性P.REMOVEDATAFOLDER 仅立即设置为真正的卸载。
答案 0 :(得分:5)
我会使用以下方法。不要调整RemoveFolderEx操作,而是使用条件自定义操作为目标属性设置适当的值。
答案 1 :(得分:0)
从this question获得一些建议,表示卸载的条件为REMOVE="All" AND NOT UPGRADINGPRODUCTCODE
。
这样的事情可能有用:
<Component Id="RemoveMyFolder">
<Condition> REMOVE="All" AND NOT UPGRADINGPRODUCTCODE </Condition>
<RemoveFolderEx ... />
</Component>