我需要允许用户指定安装程序在卸载期间是否应删除或保留注册表项。这就是我所做的。我有一个带有 Condition 元素的 RemoveRegistryKey 组件,如下所示:
<Component
Id="ID"
Guid="GUID"
KeyPath="yes" >
<Condition></Condition>
<RemoveRegistryKey
Root="HKLM"
Key="Software\PATH_TO_KEY"
Action="removeOnUninstall"/>
</Component>
这似乎按预期工作。如果我将 Condition 元素硬编码为0,则注册表项会保留,如果我将其设置为1,则注册表项会被删除。(创建此注册表项的组件不同,但我将其ForceDeleteOnUninstall属性设置为no。)
现在,我需要在卸载过程中通过用户输入来控制这种情况。我在 C# 中有一个 CA,如下所示:
[CustomAction]
public static ActionResult AskUser(Session session)
{
MessageResult result = session.Message
(
InstallMessage.User +
(int)MessageBoxIcon.Information +
(int)MessageBoxButtons.YesNo,
new Record { FormatString = String.Format("Delete registry key?") }
);
if (result == MessageResult.Yes)
session["DELETEREGKEY"] = "1";
return ActionResult.Success;
}
我使用以下代码安排 CA 执行:
<CustomAction Id="AskUserCA" BinaryKey="CA_Dll" DllEntry="AskUser" Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="AskUserCA" Before="InstallValidate">(REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>
我将 RemoveRegistryKey 组件的 Condition 元素设置为:
<Condition>DELETEREGKEY="1"</Condition>
我也尝试了 DELETEREGKEY=1 和 DELETEREGKEY,但即使我从 CA 得到提示(它出现在卸载确认对话框之后)并且我可以在日志文件中看到(当我使用日志记录时)DELETEREGKEY 设置为 1,无论响应(是或否),注册表项都不会被删除。我尝试在其他事件之前/之后安排 CA,但似乎没有任何帮助。
为什么这种情况似乎总是评估为假?有没有办法让它工作?
另外,有没有更好的选择?我正在考虑修改卸载对话框以添加一个复选框,提示用户删除注册表项,但我不确定如何执行此操作。我知道如何对安装序列进行更改——修改现有对话框或添加新对话框(我正在使用修改后的 WixUI_InstallDir 序列),但我不知道如何在卸载时进行。
有任何想法吗?