WiX 3.7:如何根据用户设置的条件删除卸载时的注册表项?

Ale*_*vis 7 windows-installer custom-action wix wix3.7

我需要允许用户指定安装程序是否应在卸载期间删除或保留注册表项.这就是我的工作.我有一个带有Condition元素的RemoveRegistryKey组件,如下所示:

<Component
    Id="ID"
    Guid="GUID"
    KeyPath="yes" >

    <Condition></Condition>

    <RemoveRegistryKey
        Root="HKLM"
        Key="Software\PATH_TO_KEY" 
        Action="removeOnUninstall"/>
</Component>
Run Code Online (Sandbox Code Playgroud)

这似乎按预期工作.如果我将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;
}
Run Code Online (Sandbox Code Playgroud)

我使用以下代码安排CA执行:

<CustomAction Id="AskUserCA" BinaryKey="CA_Dll" DllEntry="AskUser" Execute="immediate" />

<InstallExecuteSequence>
    <Custom Action="AskUserCA" Before="InstallValidate">(REMOVE="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

我将RemoveRegistryKey组件的Condition元素设置为:

<Condition>DELETEREGKEY="1"</Condition>
Run Code Online (Sandbox Code Playgroud)

我也尝试过DELETEREGKEY = 1和DELETEREGKEY,但即使我从CA获得提示(它出现在卸载确认对话框之后),我可以在日志文件中看到(当我使用日志记录时)DELETEREGKEY设置为1,无论响应(是或否),都不会删除注册表项.我尝试在其他事件之前/之后安排CA,但似乎没有任何帮助.

为什么这种情况似乎总是评估为假?有没有办法让它发挥作用?

还有,还有更好的选择吗?我正在考虑修改卸载对话框以添加一个复选框,提示用户删除注册表项,但我不知道如何执行此操作.我知道如何进行更改 - 修改现有对话框或添加新对话框 - 到安装顺序(我使用的是修改后的WixUI_InstallDir序列),但我无法弄清楚如何在卸载时执行此操作.

有任何想法吗?

Ber*_*Ott 5

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

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

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