我有一个组件,它运行几个 XmlConfig 操作:一个在安装时,一个在卸载时:
<Component Id="machine.config.Update" Guid="573DF5B0-438D-498d-8919-C4B96835C1EF">
<RegistryKey Root="HKLM" Key="[REGISTRYKEY]\Settings\[TITLE]" Action="createAndRemoveOnUninstall">
<RegistryValue Action="write" Type="integer" Name="MACHINEMEMORYLIMIT" Value="1" KeyPath="yes"/>
</RegistryKey>
<util:XmlConfig
Id="CacheNode.memoryLimit.add"
File="[WindowsFolder]\Microsoft.NET\[FRAMEWORKDIR]\v2.0.50727\CONFIG\machine.Config"
Action="create"
ElementPath="/configuration/system.web/processModel"
Name="memoryLimit"
Node="value"
On="install"
Value="90" />
<util:XmlConfig
Id="CacheNode.memoryLimit.remove"
File="[WindowsFolder]\Microsoft.NET\[FRAMEWORKDIR]\v2.0.50727\CONFIG\machine.Config"
Action="delete"
ElementPath="/configuration/system.web/processModel"
VerifyPath="/configuration/system.web/processModel"
Name="memoryLimit"
Node="value"
On="uninstall" />
</Component>
该组件是我可以安装和回滚的补丁的一部分。问题是当我卸载补丁时,卸载操作不会触发。奇怪的是,如果我将其更改为 On="install"
,则会执行相同的 XmlConfig 操作。我发现卸载时注册表项已被正确删除。为什么 XmlConfig 操作也没有触发?我检查了日志,没有看到任何错误或解释为什么没有发生。
更新: XmlConfig 操作在执行完全卸载时起作用。只是不进行补丁回滚。
最佳答案
从 wix-users 邮件列表中得到答案。
罗布·门兴: “在补丁中添加自定义操作效果不太好。补丁本质上是将转换应用于现有 MSI,然后修复 MSI。在卸载补丁的情况下,转换将被删除并修复 MSI。显然,如果自定义操作操作会随着转换被删除,然后它就没有机会运行。
Windows Installer 使用特殊的魔法来跟踪转换前后 MSI 的状态,以便他们可以正确删除数据。”
他们还讨论了 MSI 4.5 中的一项功能可以让您做到这一点,但 WIX 需要与早期版本保持兼容,并且仍然存在一些数据存储问题。
简而言之,补丁卸载的自定义操作在 WIX 中不起作用。
关于installation - WIX XmlConfig 操作未在补丁回滚时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708956/