インストール後、すぐにアプリケーションを起動するようにしたい。
インストールフォルダに移動してEXEファイルを実行、ショートカットを実行するのが面倒。
前提条件
- Windows 10 Professional
- Microsoft Visual Studio Community 2017
- Microsoft Visual Studio 2017 Installer Projects
- プロジェクト作成済みである事
- Visual Studio Installer の Setup Wizard - 名前 Setup1
- Windows フォームアプリケーション - 名前 WindowsFormsApp1
インストーラークラス を作成
Windows フォームアプリケーション のプロジェクトに インストーラークラス(Installer.cs)を作成する。
アプリケーションの起動は、インストール後の処理なので、Commitメソッドをオーバーライドして、新たなプロセスを開始するように処理を記述する。
AssemblyPath を指定して取得できるパラメーターは、アプリケーションのインストール先のパスになっている。
例)C:\Program Files (x86)\Default Company Name\Setup1\WindowsFormsApp1.exe
using System.Collections; using System.ComponentModel; using System.Diagnostics; namespace WindowsFormsApp1 { [RunInstaller(true)] public partial class Installer : System.Configuration.Install.Installer { public Installer() { InitializeComponent(); } public override void Commit(IDictionary savedState) { base.Commit(savedState); Process.Start(this.Context.Parameters["AssemblyPath"]); } } }
カスタム動作で指定をする
Visual Studio Installer プロジェクトの ファイルシステム > Application Folder に、プライマリ出力で Windows フォームアプリケーション を追加する。
その後、カスタム動作にて、プライマリ出力 Windows フォームアプリケーション(WindowsFormsApp1)を追加する。
Commitメソッドしかオーバーライドしていないが、全てに対して指定を行わないと、うまく動作しなかった。
設定完了。
Windows フォームアプリケーション をビルド後に Visual Studio Installer プロジェクト をビルドして、インストールして動作を確認する。
余談
情報を探していると、Visual Studio Installer プロジェクトのカスタム動作で CustomActionData に [TARGETDIR] を指定し、インストーラークラス で、その値を取得して処理を行うパターンが見受けられた。
このやり方はナンセンスすぎるように思える。
Visual Studio Installer プロジェクト で指定されるカスタム値を、別プロジェクトのインストーラークラスが、それをある前提で値を受け取り処理をするのは、依存度が高くて危険すぎる。
結局、その値をゴチャゴチャやって、this.Context.Parameters["AssemblyPath"] で取れる値と同じものを作成していたりする。
動けばいいんですけど、私は許容できないなぁ。