最近の業務の担当のひとつは Visual Studio Installer Projects 2022(以下VSIP)を使って作成した、 Windows アプリケーションのインストーラーの改善・障害修正。VSIP は Visutal Studio 2010 で追加され Visual Studio 2012 でなぜか削除された標準のセットアッププロジェクト作成機能が拡張機能として復活したもので、機能的には当時からあまり変わらず、すこし凝ったことをしようとすると Windows Installer 用の API を直接呼び出して .msi ファイルを操作したりしなければなりません。ですのでこれまでは積極的な選択肢にはなり得なかったのですが、最近は WIX Toolset や Inno Setup といった従来コストのかからなかったインストーラー作成ソフトが商用利用では無償で使えなくなり、一方プロプライエタリでもっとも歴史のある著名な InstallShield はいまどきのソフトウェア配布環境を鑑みると導入が躊躇われるほどあまりに高価なのが変わらず、と状況が変化したので、もしかしたらこれから使われる機会が増えるかもしれません。そこで気づいた点をメモしておくことにします。
先に記した通り VSIP は Windows Installer 用のファイルを作成し、またインストール結果は VSIP にも Windows Installer にもよらないものがあるので、 VSIP 以外の話題もあわせて記します。
コード署名機能なし
Microsoft Defender SmartScreen の登場でインストーラーへのコード署名の重要性は増しましたが、VSIP にはコード署名の機能はありません。コードサイニング証明書を別途入手したうえでポストビルドプロセス等で signtools.exe を呼び出すなどして署名しなければなりません。
深いフォルダー階層に未対応
インストールできるファイルシステムフォルダー構成は 1 階層までとなっています。 2 階層以上のフォルダー構成をインストール対象に指定すると、インストーラーの作成は成功しますが、インストール実行時に失敗します。
アップグレードインストールのときカスタム動作が呼びだされないことあり
VSIP ではカスタム動作を実装することでインストール開始前やインストール確定後の処理を記述できます(Custom Actions Management in Deployment | Microsoft Learn)。しかしこのカスタム動作はかならず呼びだされるとは限らず、確認した範囲ではアップデートインストールで呼びだされないケースがありました。私の確認したケースではインストーラーの構成をかなりカスタマイズしているのでかならず呼びだされないとも言えないのですが、念頭に置いておくと想定外の挙動を示したときに解決の手がかりになるかもしれません。参考情報として。
アップグレードインストール時の再起動は再起動マネージャーが管理
Windows Installer は歴史ある機能で、Windows NT 4.0 や Windows 95 の時代に登場し、Windows 7 の時代まで順次アップデートされたあと、変更されないまま Windows 11 に至ります。
ではインストールに関係する機能はまったく変わっていないかというとそういうことはなく、 Windows Vista で追加された Restart Manager(再起動マネージャー) がインストール時の挙動に影響を与えています。再起動マネージャー自体は Windows の再起動を減らすための仕組みですが、この仕組みがアップデートインストール時のファイル更新時にも機能するのです。
具体的にはアップデートインストール時に実行中のファイルを上書きしようとしたときの挙動が以前とは変わっています。 Windows Installer は更新対象ファイルが実行中のとき警告ダイアログを表示してユーザーに選択を促します(選択肢は「再試行」「無視」「終了」)。ここで「無視」を選択したとき、以前の Windows であればインストール終了後に Windows 自体の再起動が求められたのですが、現在は再起動マネージャーの取り扱える範囲であればその実行ファイルの終了と開始を再起動マネージャーが担うことで再起動が抑止されます。一般的な実行ファイルだけでなく、 Windows サービスも対象です。
そのため、現在の Windows Installer の再起動まわりの挙動は結果的にドキュメント(System Reboots - Win32 apps | Microsoft Learn)と乖離しています。再起動が必要かもしれないと考えたときは挙動をたしかめてみるのがよいと思います。
スタートメニュー登録用アイコンのフォーマットには注意が必要
スタートメニュー登録用に用意するアイコンファイル(.ico)は他用途向けのものと比較すると守らなければならない点が微妙に多く注意が必要です。試した限りでは次を守ると十分な品質を保った表示となります。
- サイズは 256px / 48px / 32px / 24px / 16px を同梱
- 色深度は 32 ビット(アルファチャンネルは 8 ビット)
- 圧縮はなし(アイコンファイルの仕様で、ありのときは PNG 、なしのときは BMP となります)
いちばんのポイントは圧縮なしの指定です。インストール対象の実行ファイルに指定するアイコンや VISP の AddRemoveProgramsIcon プロパティで指定するアイコンは圧縮ありでも問題ないのですが、スタートメニュー用のアイコンだけは圧縮ありとすると表示されなくなります。他では問題ないだけに注意が必要です。
また確認した限りでは圧縮なしであればサイズの同梱数や色深度等が若干異なっても表示されなくはないのですが、条件が揃っていないと表示品質が悪くなります(透過指定部との境界にノイズが乗る、きれいに縮小されない?等)。上記条件を守ったアイコンファイルを用意するのが確実です。
VSIP の情報源としてはその元となったセットアッププロジェクトの詳細を解説するDOBON.NETのセットアッププロジェクト - .NET Tips (VB.NET,C#...)の記載内容が現在においても有効です。私も何度も参考にさせていただきました。記して感謝します。
本エントリもどなたかの参考になりましたら幸いです。