2013-05-16 98 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函數進行假定。

我希望它能幫助一些人。