2017年11月10日金曜日

WiX toolsetのBootstarpperを試してみた(2)Detect追加

前回はPlanCompleteとApplyComplete のイベントハンドラ だけを追加したクラスからインストールを開始し、msiのUIによるインストール/アンインストールを行うところまで設定した。

今回は DetectPackageComplete を追加する。
  • Runメソッド変更
    protected override void Run()
    {
        this.DetectPackageComplete += this.OnDetectPackageComplete;
        this.PlanComplete += this.OnPlanComplete;
        this.ApplyComplete += this.OnApplyComplete;
        Engine.Detect();
    }
    
  • DetectPackageComplete イベントハンドラ追加
    private void OnDetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)
    {
        if (e.PackageId == "MySetup.msi")
        {
            if (e.State == PackageState.Absent)
            {
                Engine.Plan(LaunchAction.Install);
            }
            else if (e.State == PackageState.Present)
            {
                Engine.Plan(LaunchAction.Uninstall);
            }
        }
    }
    
前回は Runメソッドで Engine.Plan を呼んでいたが、これを Engine.Detect に変更。その結果、MySetup.msi が見つからなければ Install、見つかれば Unistall を実行するようになる。

これにより MySetup.exe を複数回起動すると、Install と Unistall が交互に繰り返されるようになる。

このとき、次のようなログが書かれる。
Detected package: MySetup.msi, state: Absent, cached: None
または
Detected package: MySetup.msi, state: Present, cached: Complete

何度実行しても常に Absent の場合は msi 作成時の ID 設定をチェックする。これが"*"の場合は Present にならない。"*"を固定の GUID に変更する。

Engine.Detect では他に次のイベント呼び出しがあるが、詳しく調べていない。
  • DetectRelatedMsiPackage
  • DetectRelatedBundle
  • DetectComplete
次回で Bootstapper で msi 起動時のパラメータを設定し、言語切り替えを行えるようにする。
参考リンク
Bootstrapper Application Interface
IBootstrapperApplicationの説明。ソースを見ていないが、ManagedBootstrapperApplicationHost はこれを実装し、C#の BootstrapperApplication のイベント呼び出しを行うものでしょう。

Creating a custom UI installer with WIX Burn Bootstrapper
WPFアプリケーションにブートストラッパ実装例。

EngineとBootstrapperの関係、イベント一覧があります。

発生順のイベントリストがあります。


0 件のコメント: