我需要允许用户在卸载时指定安装程序是否删除或保留注册表键。这是我的做法。 我有一个名为RemoveRegistryKey的组件,其中包含一个条件元素,如下所示:
<Component
Id="ID"
Guid="GUID"
KeyPath="yes" >
<Condition></Condition>
<RemoveRegistryKey
Root="HKLM"
Key="Software\PATH_TO_KEY"
Action="removeOnUninstall"/>
</Component>
这似乎按预期工作。如果我将条件元素硬编码为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,但似乎没有任何帮助。
为什么这个条件似乎总是评估为false?有没有办法让它工作?
此外,是否有更好的替代方案? 我正在考虑修改卸载对话框以添加复选框提示用户删除注册表键,但我不确定如何做到这一点。 我知道如何进行更改-修改现有对话框或添加新对话框-以执行序列(我正在使用修改后的WixUI_InstallDir序列),但我无法弄清楚如何在卸载时执行此操作。
有什么想法吗?