砂漠の旅人が歩む道は、時に予想もしなかった方向へ進むものだ。Visual Studio 2026への移行を果たした私は、インストーラーについても大きな決断をした。MSI形式からEXE形式へ。Microsoft Visual Studio Installer Projects 2022からInno Setupへの移行だ。
MSI形式のインストーラーは確かに機能する。しかし、カスタマイズの自由度、スクリプトの可読性、そして何より「作品としての表現力」において、限界を感じていた。Inno Setupは、これらすべてを解決する可能性を秘めていた。
この羊皮紙のあらまし
- この羊皮紙のあらまし
- この羊皮紙が導く者
- 砂漠の道標
- なぜMSIからEXEへ移行したのか
- Inno Setupの導入
- ウィザードが紡ぐ最初の呪文
- 呪文を編集し、コンパイルを実行する
- インストーラーが紡ぐ体験
- カスタマイズのポイント
- 完成した呪文の全貌
- 羊皮紙を巻く前に
- 砂漠で見つけた魔法のランプ
- ラクダの独り言
この羊皮紙が導く者
- Visual Studio Installer Projects 2022からの移行を検討している開発者
- MSI形式とEXE形式のインストーラーの違いを理解したい錬金術師
- Inno Setupの基本は知っているが、細部の調整に苦戦している旅人
- インストーラーにも世界観を表現したい創造者
砂漠の道標
- Inno Setup - Windows用インストーラー作成ツール。オープンソースで商用利用も可能だが、バージョン6.5.0から開発者は商用ユーザーにライセンス購入を要請している
- 相対パス - プロジェクトフォルダを基準とした相対的なファイルパス。ポータビリティ確保に必須
- recursesubdirs - サブディレクトリを再帰的に含めるフラグ。.NETアプリの階層構造維持に不可欠
- VersionInfoVersion - setup.exeのプロパティに表示されるバージョン情報のメタデータ
- WizardImageFile - インストーラーのサイドパネルに表示される画像。世界観表現の要
- PrivilegesRequired - インストールに必要な権限レベル。lowestは管理者権限不要を意味する
なぜMSIからEXEへ移行したのか
🔗 前回の冒険: Visual Studio 2026 移行実験
前回の記事で「今後は Inno Setup を検討する」と記した。この一文は、単なる検討ではなく、実行へと移った。その最大の理由は、Microsoft Visual Studio Installer Projects 2022の煩雑さだった。
GUIの複雑さという迷宮
MSインストーラープロジェクトのGUI画面構成は、とにかく分かりづらい。何度作っても慣れることがなく、毎回「どこに何があったか」を思い出すところから始まる。設定項目が階層的に散らばり、直感的な操作を阻む。
Windows Kitという追加の呪縛
さらに面倒なのが、Windows Kitの別途インストールだ。MSIファイルに警告を抑制するため、PostBuildEventに以下の呪文を指定する必要がある。
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\MsiInfo.exe" "$(BuiltOuputPath)" /W 10
これはWindows SDKの一部であり、別途インストールが必要だ。環境構築のたびにこの儀式を繰り返すのは、あまりにも煩雑だった。
Inno Setupの導入
まず、Inno Setupを導入する必要がある。wingetを使えば一行で完了する。
winget install --id jrsoftware.InnoSetup -e
インストールが完了すれば、Inno Setup Compilerが使えるようになる。
ウィザードが紡ぐ最初の呪文
Inno Setup Compilerのウィザード(Script Wizard)は雛形を自動生成してくれる。しかし、この初期状態には重大な罠が潜んでいた。
絶対パスという名の呪い
ウィザードが生成するSourceパスは、あなたのPCの絶対パスになる。これでは「私のPCでしかコンパイルできない」という悲劇が待っている。
; ウィザードが生成した呪われたパス Source: "D:\repos\RedfishViewer\bin\Release\publish\win-x64\*"; DestDir: "{app}"; Flags: ignoreversion
この呪いを解くには、相対パス(Relative Path)への書き換えが必須だ。
; 相対パスで解呪された状態 Source: "RedfishViewer\bin\Release\publish\win-x64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
同時にrecursesubdirs createallsubdirsという呪文を追加した。これは.NETアプリ特有の階層構造を維持するための必須フラグだ。
プロジェクトフォルダを汚さない知恵
OutputDirを指定して、生成されたインストーラーをSetupフォルダに収める。
[Setup] OutputDir=Setup OutputBaseFilename=RedfishViewer_Setup
呪文を編集し、コンパイルを実行する
スクリプトを編集したら、コンパイル(Compile)を実行する。ツールバーの「Compile」ボタンかCtrl+F9キーだ。「Run」ボタン(F9)を押すと、コンパイル後に即座にインストーラーが実行されてしまうため注意が必要だ。
コンパイルが成功すれば、SetupフォルダにRedfishViewer_Setup.exeが生成される。
インストーラーが紡ぐ体験
生成されたインストーラーを実行すると、洗練されたウィザードが旅人を導く。
言語選択だ。Inno Setupは標準で日本語メッセージファイルを搭載している。
インストール先の選択だ。DefaultDirNameで指定したユーザーのローカルフォルダがデフォルトとなる。
追加タスクの選択だ。デスクトップアイコンの作成など、[Tasks]セクションで定義した設定を選べる。
インストール準備完了画面だ。「インストール」を押せば儀式が始まる。
インストール進行中だ。プログレスバーが錬金術の進捗を示す。
セットアップ完了画面だ。神器の即座の起動を選択できる。
カスタマイズのポイント
アイコンと画像
デフォルトのInno Setupは、味気ないアイコンを使う。自作のアイコンとウィザード画像で世界観を表現できる。
[Setup] SetupIconFile=RedfishViewer\RedfishViewer.ico UninstallDisplayIcon={app}\{#MyAppExeName} WizardImageFile=Images\SideImage.bmp WizardSmallImageFile=Images\SmallImage.bmp WizardImageStretch=yes
今後、「たびとの旅路」のメインビジュアルである砂漠の旅人を使用し、世界観を統一する予定だ。これらの画像はGitHubには含めず、.gitignoreにImages/を追加してローカルコンパイル時のみ参照する運用を選んだ。
バージョン情報の完全化
setup.exeのプロパティ情報を完全に記述することで、「作りかけのソフト」に見えることを防ぐ。
[Setup] AppVersion={#MyAppVersion} AppCopyright=Copyright (C) 2023-2026 Tabito's Works VersionInfoVersion={#MyAppVersion} VersionInfoCompany={#MyAppPublisher} VersionInfoDescription={#MyAppName} Installer VersionInfoProductVersion={#MyAppVersion}
これにより、Windowsのエクスプローラーで表示されるプロパティが完全に埋まる。
完成した呪文の全貌
完全な.issスクリプトは、たびとのアトリエ(GitHub)で公開している。現在はfeature/1.1.0/package-updateブランチで作業中だが、完了後はmainブランチにコミットし、正式にv2.0.0としてリリースする予定だ。
重要な部分のみ、ここに記しておこう。
[Setup] AppId={{83CA612F-3F90-4CF2-A6A0-005EC83DDEB7} AppName={#MyAppName} AppVersion={#MyAppVersion} AppPublisher={#MyAppPublisher} DefaultDirName={localappdata}\TabitosWorks\{#MyAppName} PrivilegesRequired=lowest DisableProgramGroupPage=yes WizardStyle=modern SetupIconFile=RedfishViewer\RedfishViewer.ico WizardImageFile=Images\SideImage.bmp OutputDir=Setup OutputBaseFilename=RedfishViewer_Setup VersionInfoVersion={#MyAppVersion} VersionInfoCompany={#MyAppPublisher}
この呪文により、プロフェッショナルなインストーラーが完成する。
羊皮紙を巻く前に
MSI形式からEXE形式へ。この移行は、単なる技術的選択ではなかった。
Inno Setupという解放
対してInno Setupは、スクリプトベースのシンプルさだ。
- テキストエディタで編集可能な
.issファイル - 追加のSDK不要
- Gitでの差分管理が容易
- 何より、直感的に理解できる構造
この移行は、技術的選択というより、開発体験の改善という実利的な決断だった。
Inno Setupの優れた点
- スクリプトベースの柔軟性 - Pascal風の記述により、ほぼすべてをカスタマイズ可能
- 完全な日本語対応 - 標準で日本語メッセージファイルを搭載
- 可読性の高いスクリプト - 人間が読めるテキスト形式で、バージョン管理が容易
- 世界観の表現 - 画像やメッセージを自由にカスタマイズできる
まとめ
RedfishViewer v2.0.0は、Inno Setupという錬金術により、MSI形式からEXE形式へと生まれ変わる。
それは単なる形式変更ではなく、作品としての表現力を高める選択だ。インストーラーという入口から、砂漠の旅人の世界が始まる。
この錬金術が、あなたの作品に新たな表現の可能性を与えることを願っている。
砂漠で見つけた魔法のランプ
- Inno Setup 公式サイト | 本家ダウンロードとドキュメント
- RedfishViewer - GitHub | 今回の実装例。feature/1.1.0/package-updateブランチで詳細を確認可能
- Visual Studio 2026 移行実験 | 前回の冒険記録
ラクダの独り言
ご主人がまたインストーラーをいじり始めた。MSIがどうとか、EXEがどうとか言ってるが、俺にはさっぱりだ。ただ、画面に砂漠の絵が出るようになったのは面白いな。ご主人らしいっちゃらしい。まったく、飽きねえお人だ。