2013-05-16 65 views
0

我在wix包中有2个msi我正在使用wix 3.7的自定义引导程序。我的安装,卸载和取消命令完美地工作。当我试图给添加/删除msi捆绑使用功能:如何从包含多个MSI(如安装项目的添加/删除功能)的wix定制引导程序包安装/卸载单个msi?

this.ModifyCommand = new DelegateCommand(() => this.model.PlanAction(LaunchAction.Modify),() => this.state == InstallState.Present);  

它不按预期方式工作。我使用下面的代码来检测包

protected void DetectPackageComplete(object sender,DetectPackageCompleteEventArgs e) 
    { 
     //System.Diagnostics.Debugger.Launch(); 

     if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal)) 
     { 
      this.State = e.State == PackageState.Present ? InstallState.Present : InstallState.NotPresent; 
      this.model.LogMessage("Setup1.msi"+this.State.ToString()); 
     } 

     if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal)) 
     { 
      this.State = e.State == PackageState.Present ? InstallState.Present : InstallState.NotPresent; 
      this.model.LogMessage("Setup2.msi" + this.State.ToString()); 
     } 
    } 

后重新安装我的UI显示添加选项/删除,删除,修复,利用我可以从我的包卸载单微星重新安装下一个安装,但下一次它不检测剩余的包裹。

如果我不安装setup2.msi它显示添加/删除屏幕,但修改按钮被禁用,如果我卸载setup1.msi它要求全新安装。

回答

0

最后我解决了这个问题,我不知道它是对还是错,但是我已经实现了它,它对我来说工作正常。

这里是manged BA

private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e) 
    {   

     if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal)) 
     { 
      this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State); 

      string IsSetup1= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup1"]; 

      if (IsSetup1== "True") 
      { 
       e.State = RequestState.Present; 
      } 
      else 
      { 
       e.State = RequestState.Absent; 
      } 

      this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State); 

     } 

     if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal)) 
     { 
      this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State); 

      string IsSetup2= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup2"]; 

      if (IsSetup2== "True") 
      { 
       e.State = RequestState.Present; 
      } 
      else 
      { 
       e.State = RequestState.Absent; 
      } 

      this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State); 
     } 
     } 

的代码下面的事件添加下面一行的WireUpEventHandlers()函数

this.model.BootstrapperApplication.PlanPackageBegin +=this.PlanPackageBegin; 

这里chkSetup1和chkSetup2值从制作自定义UI设置为True或False用于特征树和SetBurnVariable函数。 我希望这会对一些人有所帮助。

0

最后,我解决了这个问题,我不知道它是对还是错,但是我已经实现了它,它对我来说工作正常。

这里是在manged BA代码

附加以下事件

private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e) 
    {   

     if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal)) 
     { 
      this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State); 

      string IsSetup1= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup1"]; 

      if (IsSetup1== "True") 
      { 
       e.State = RequestState.Present; 
      } 
      else 
      { 
       e.State = RequestState.Absent; 
      } 

      this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State); 

     } 

     if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal)) 
     { 
      this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State); 

      string IsSetup2= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup2"]; 

      if (IsSetup2== "True") 
      { 
       e.State = RequestState.Present; 
      } 
      else 
      { 
       e.State = RequestState.Absent; 
      } 

      this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State); 
     } 
     } 

添加下面一行WireUpEventHandlers()函数

this.model.BootstrapperApplication.PlanPackageBegin +=this.PlanPackageBegin; 

这里chkSetup1和chkSetup2值被设置为True或从自定义用户界面中为特征树和SetBurnVariable函数进行假定。

我希望它能帮助一些人。