2016-09-21 5 views
1

私は、ユーザがインストールしたいものに応じて複数のMSIをインストールするようにカスタムを作成しています。Bootstrapperこれまでのところすべて正常に動作しますが、インストーラを再度実行して、アンインストールする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); 
} 

私はアンインストール(FullUninstallingない)だ場合、私はその後、PlanPackageBeginにチェック:私はBootstrapper計画それ自身を処理させる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; 
     } 
    } 
} 

と。

WisStateとrequestMSI1/2は、私のUIの表示内容とユーザーの選択によって変わることに注意してください。

関連する問題