我需要允许用户指定在卸载过程中安装程序应删除还是保留注册表项。这是我的工作。我有一个带有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顺序),但是我不知道如何在卸载时进行操作。

有任何想法吗?

最佳答案

通常,您将对话框安排在UI序列中,而不是安排在执行序列中。
如果不执行此操作,则无法进行无提示(取消)安装。

我认为您的CustomAction(CA)运行到很晚,并且已经创建了将要执行的脚本。
在这种情况下,DELETEREGKEY未设置并且评估为false-结果键保持不变。

请尝试将您的CA移至UI序列。

07-27 21:41