如何在程序窗口中删除部分捆绑而不删除它?

时间:2016-09-21 11:16:56

标签: c# wix bootstrapper burn uninstaller

我正在制作一个自定义Bootstrapper来安装多个MSI,具体取决于用户想要安装的内容。到目前为止一切正常,但我希望能够再次运行安装程序并选择卸载哪个MSI。如果要卸载所有已安装的MSI,则删除捆绑,否则将其保留,以便用户可以添加或删除另一个MSI。

我想在PlanPackageBegin事件处理程序中执行类似的操作:

if (WisState == State.Uninstalling)
        {
            if (e.PackageId.Equals("MSI1", StringComparison.Ordinal))
            {
                if (requestMSI1 == RequestState.Present)
                {
                    e.State = RequestState.None;
                }
                else
                {
                    e.State = RequestState.Absent;
                }
            }
}

然后在PlanComplete事件处理程序中我开始:

Bootstrapper.Engine.Apply(System.IntPtr.Zero);

然后捆绑包也会卸载。

如果不是要卸载所有MSI,如何防止卸载我的捆绑包?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。

我没有计划卸载,而是计划修复以防止我的软件包被卸载。要在卸载所有MSI时将其删除,我计划卸载。

if (requestMSI1 == RequestState.Absent && requestMSI2 == RequestState.Absent)
{
    this.WisState = State.FullUninstalling;
    Bootstrapper.Engine.Plan(LaunchAction.Uninstall);
}
else
{
    this.WisState = State.Uninstalling;
    Bootstrapper.Engine.Plan(LaunchAction.Repair);
}

然后我检查了PlanPackageBegin我是否卸载(不是完全卸载):

if (WisState == State.Uninstalling)
{
    if (e.PackageId.Equals("MSI1", StringComparison.Ordinal))
    {
        if (requestMSI1 == RequestState.Absent)
        {
            e.State = RequestState.Absent;
        }
        else
        {
            e.State = RequestState.None;
        }
    }
    else if (e.PackageId.Equals("MSI2", StringComparison.Ordinal))
    {
        if ("requestMSI" == RequestState.Absent)
        {
            e.State = RequestState.Absent;
        }
        else
        {
            e.State = RequestState.None;
        }
    }
}

如果我是FullUninstalling,我让Bootstrapper处理自己的计划。

请注意,WisState和requestMSI1 / 2是我改变的变量,具体取决于我的UI应该显示的内容以及用户的选择。