我有一个运行几个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操作有效。只是没有补丁回滚。
答案 0 :(得分:1)
从wix-users邮件列表中得到答案。
Rob Mensching: “在补丁中添加自定义操作效果不佳。补丁基本上将转换应用于现有的MSI,然后修复MSI。在卸载补丁的情况下,转换被删除并且MSI被修复。显然,如果自定义通过变换删除操作,然后它就没有机会运行。
Windows Installer会在转换前后跟踪MSI的状态,以便正确删除数据。“
他们还讨论了MSI 4.5中有哪些功能可以让你这样做,但WIX需要保持与早期版本兼容,并且周围仍然存在一些数据存储问题。
简而言之,补丁卸载的自定义操作在WIX中不起作用。
答案 1 :(得分:0)
我已经验证了您的样品(差不多),它运行正常。问题可能出在您的FRAMEWORKDIR属性中。确保在正确安装和卸载时都设置了它。
可能会出现这种情况,即它会回退到Uninstall flow的默认值,并且该属性会被删除,但是会从另一个文件中删除。