2016-09-21 56 views
1

我正在定制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都将被卸载,我该如何防止卸载我的软件包?

回答

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如果我卸载(不FullUninstalling):

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应该显示的内容和用户的选择而变化的变量。

相关问题