Visual Studio Installerを使ってWindowsインストーラー(msi)の作成の仕方

2021年9月5日

今回は、Windowsインストーラーを作成する方法を紹介します。

Visual Studio Installerをインストール

Visual Studioは、すでにインストールされている環境であると思います。
もしインストールがまだであれば以下のページで以前説明しています。参考にしてください。

初心者必見!プログラミングのやり方を教えます。
初心者必見!プログラミングのやり方を教えます。
こんにちは、ノムノムです。 あなたは、このページに記事に来たということはプログラミング学習を始めたい、もしくは…
https://nomux2.net/programing_start/#toc_id_4_1

拡張機能を選択する

メニューの「拡張機能」ー「拡張機能の管理」を選択します。

左のメニューから「オンライン」を選び検索ボックスに「installer」と入力すると「Microsoft Visual Studio Installer Projects」と出てくるので「ダウンロード」をクリックします。

以下のメッセージがダイアログ下部に表示されたら一度Visual Studioを終了します。

Visual Studioが終了されるとインストールが開始されます。

以下のダイアログが出てくれば完了です。再度Visual Studioを起動してください。

プロジェクトの作成

次にソリューションの中にInstallerプロジェクトを作成します。今回はOpenCVの記事を書いたときに動作を確認するために作ったサンプルプロジェクトを利用しています。

ソリューションを右クリックし、「追加」ー「新しいプロジェクト」を選択します。

プロジェクト テンプレートの中から「Setup Project」を選びます。installerで検索すればHitすると思います。

プロジェクト名は適当に付けます。今回は「OpenCVSample」のインストーラーということで「OpenCVSampleInstaller」としました。
これくらい安直な方が他の人に見られたときにすぐわかってよいと思います。

Installerプロジェクトができました。

インストールするものを設定する

それではインストール時にコピーされるファイルを設定していこうと思います。

まずInstallerプロジェクトを右クリックし、「View」ー「ファイルシステム」を選択します。

そうするとインストール用のツリーが出てきますのでここに設定していきます。

Application Folderインストールされるフォルダを指します。
User’s Desktopデスクトップフォルダを指します。
User’s Programs Menuプログラムメニューを指します。

「Application Folder」を右クリックして「Add」ー「プロジェクト出力」を選択します。

プロジェクトを選んで、構成はReleaseにしておく方がいいと思います。OKを押すと追加されます。

ここに含まれるプロジェクトはInstaller作成時に指定した構成でビルドされます。
スタートメニューに入れる場合はショートカットを作成します。

「User’s Programs Menu」にフォルダを作成してください。

「Application Folder」にて対象のプライマリ出力のショートカットを作成します。

名前を変更し、「User’s Programs Menu」内の作成したフォルダに移動します。

これでインストール時にインストールフォルダにあるEXEのショートカットをスタートメニュー上に作成してくれます。

これで設定は完了です。

プロパティの設定をする

プロジェクトをクリックした時に表示されるプロパティについて、重要な項目の設定を解説していきます。

Version

すでにインストールされて更新処理を行う時にVersionが新しくないと実行できないので、新しい更新をする際はexeのアセンブリ情報だけではなく、忘れずにインストーラーのバージョンを上げる必要があります。

形式は9.9.9のメジャー、マイナー、リビジョンまで対応しています。

ちなみにEXEやDLLのバージョンを上げずにインストーラーのバージョンだけを上げた場合、対象ファイルのバージョンが上がっていないため更新されていないと判断され更新インストールは成功しますがEXEやDLLは更新されません。

RemovePreviousVersions

インストール時に古いバージョンがあった場合に古いバージョンをアンインストールします。

これをtrueにしておかないとインストーラーが実行されるたびに「プログラムと機能」にインストールされたものが増えていきます。

Manufacturer

製作者を設定します。

インストールされるフォルダのデフォルト設定は以下のようになっています。

[ProgramFilesFolder][Manufacturer][ProductName]

「User’s Programs Menu」にショートカットを作成した場合もフォルダ名に使用されます。

Windows インストーラーを作成する

最低限の設定が完了したので、Installerを作成していきたいと思います。

Installerプロジェクトを右クリックして「ビルド」もしくは「リビルド」を選択してみてください。

うまく作成されています。

これを実行するとインストーラーが起動します。特に変えていないのですべてデフォルトです。

完了するとインストールされます

スタートメニューに追加されている
インストール先フォルダに展開されている

イベントごとの処理を作成する

インストール時に処理を行いたい場合についての方法を紹介します。
まずカスタム動作専用のC#クラスライブラリプロジェクトを作成します。

クラスライブラリを選択します。

プロジェクト名を付けます。ここでは「InstallCustomAction」にしたつもりでしたが、スペルミスしてますね・・・。

まず参照を追加します。「参照の追加」を選択します。

「アセンブリ」の中から「System.Configuration.Install」にチェックを入れて「OK」ボタンを押してください。

次にソースです以下のコードをCopyしてください。

[System.ComponentModel.RunInstaller(true)]
public class InstallerCustomActionClass : System.Configuration.Install.Installer
{
    /// <summary>
    /// インストール後の動作
    /// </summary>
    /// <param name="stateSaver"></param>
    public override void Install(System.Collections.IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }

    /// <summary>
    /// コミット時の動作
    /// </summary>
    /// <param name="savedState"></param>
    public override void Commit(System.Collections.IDictionary savedState)
    {
        base.Commit(savedState);
    }

    /// <summary>
    /// 失敗してロールバック時の動作
    /// </summary>
    /// <param name="savedState"></param>
    public override void Rollback(System.Collections.IDictionary savedState)
    {
        base.Rollback(savedState);
    }

    /// <summary>
    /// アンインストール時の動作
    /// </summary>
    /// <param name="savedState"></param>
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
}

コピーしたものを作成したクラスに上書きして貼り付けてください。

各動作に処理を記述してください。

カスタム動作を設定します。Installerプロジェクトを右クリックして「View」ー「カスタム動作」を選択して下さい。

追加したいアクションで右クリックをしてカスタム動作の追加を選択します。

Application Folderをダブルクリックしてフォルダの中に入ります。

当たり前ですが「InstallerCustomAction」はありませんから「Add Output…」をクリックして追加します。

プロジェクトを選んで構成をReleaseにします。

追加したカスタム動作のプロジェクトを選択します。

これでインストール時にクラスのInstall関数が呼ばれます。

注意しなければ行けないのは呼ばれるのはインストールが終わった後だということです。

まとめ

お疲れ様でした。あとは配布するだけですね。

ここまで読んで頂いてありがとうございます。