📁

VisualStudioでインストーラを作って、自作の処理を登録する

2022/12/26に公開

概要

VisualStudioでインストーラを作ることができる
MicrosoftのIDEなので当然といえばそうなのだが、処理を自作したい場合は多少の準備が必要となる
翌月にはきれいさっぱりと忘れている自信があるので、記事にして残す

使用環境

Windows10 22H2 (Professional)
VisualStudio 2022 (Community)
#主役のアプリケーションについては、プロジェクトが既に存在するものと仮定

準備

  1. VisualStudioのメニューから[拡張機能]>[拡張機能の管理]を押下し、
    Microsoft Visual Studio Installer Projectsを追加

  2. [ツール]>[ツールと機能の取得]からC#(.NETデスクトップ開発)を有効化する

インストーラ作成 & カスタムアクションの登録

  1. 下記の状態を目指して設定を進める
    ソリューションで右クリック>[追加]>[新しいプロジェクト]を押下

  2. インストーラ本体のプロジェクトを作るため、画像のSetup Projectを作成

  3. 続けて、インストーラに登録するカスタムアクションを作るため、画像のC#クラスライブラリ(.Net Framework)を作成

  4. カスタムアクションのプロジェクトから参照を右クリック>[参照の追加]

  5. System.Configuration.Installにチェックを付ける(必須)

  6. デバッグ用にメッセージボックスを使用する場合はSystem.Windows.Formsにもチェックを付ける

  7. 続けてカスタムアクションを登録する
    インストーラプロジェクトを右クリック>[View]>[カスタム動作]を押下

  8. 表示されたウィンドウから、Installを右クリック>[カスタム動作の追加]を押下し、下画像のウィンドウを表示させる

  9. ウィンドウ上部のプルダウンリストからApplication Folderを選択

  10. Add Outputを押下

  11. ウィンドウ上部のプルダウンリストから、事前に作成したカスタムアクションプロジェクトを選択
    構成はRelease Any CPUで良い

  12. Install配下にカスタムアクションが登録されたことを確認

  13. あらかじめプロパティウィンドウを表示させておき、前段のカスタムアクションを押下する

プロパティウィンドウのCustomActionDataに入力した値は引数として渡すことができる
#一例としてmsiファイルの配置パスを記入
/SrcDir="[SourceDir]\"

カスタムアクションの処理を作成

  1. 下記のようにカスタムアクションプロジェクトのデフォルトクラスを書き換え、既存の各処理をオーバーライドして処理を追加する
namespace InstallerCustumAction
{
    [System.ComponentModel.RunInstaller(true)]
    public class class1 : System.Configuration.Install.Installer
    {
        public override void Install(System.Collections.IDictionary state)
        {
            base.Install(state);

            // Get installation path
            string dst = System.IO.Path.GetDirectoryName(this.Context.Parameters["AssemblyPath"]);
            // Get msi file path from argument
            string src = System.IO.Path.GetDirectoryName(this.Context.Parameters["SrcDir"]);
	    
	    // Show message box for testing
            System.Windows.Forms.MessageBox.Show(dst);
            System.Windows.Forms.MessageBox.Show(src);
        }

        public override void Commit(System.Collections.IDictionary state){base.Commit(state);}
        public override void Rollback(System.Collections.IDictionary state){base.Rollback(state);}
        public override void Uninstall(System.Collections.IDictionary state){base.Uninstall(state);}
    }
}
  1. 後は、インストーラのプロジェクトをリビルドして完成

Discussion