たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

【Inno Setup】MSIからEXEへ ~ インストーラー形式を変える決断~

砂漠の旅人が歩む道は、時に予想もしなかった方向へ進むものだ。Visual Studio 2026への移行を果たした私は、インストーラーについても大きな決断をした。MSI形式からEXE形式へ。Microsoft Visual Studio Installer Projects 2022からInno Setupへの移行だ。

MSI形式のインストーラーは確かに機能する。しかし、カスタマイズの自由度、スクリプトの可読性、そして何より「作品としての表現力」において、限界を感じていた。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の起動ダイアログ

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

呪文を編集し、コンパイルを実行する

Inno Setupの編集画面

呪文を編集する錬金術師の作業場

スクリプトを編集したら、コンパイル(Compile)を実行する。ツールバーの「Compile」ボタンかCtrl+F9キーだ。「Run」ボタン(F9)を押すと、コンパイル後に即座にインストーラーが実行されてしまうため注意が必要だ。

Inno Setupのコンパイル完了

コンパイル成功。指定したOutputDirにインストーラーが生成される

コンパイルが成功すれば、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には含めず、.gitignoreImages/を追加してローカルコンパイル時のみ参照する運用を選んだ。

バージョン情報の完全化

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としてリリースする予定だ。

🔗 RedfishViewer - GitHub

重要な部分のみ、ここに記しておこう。

[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の優れた点

  1. スクリプトベースの柔軟性 - Pascal風の記述により、ほぼすべてをカスタマイズ可能
  2. 完全な日本語対応 - 標準で日本語メッセージファイルを搭載
  3. 可読性の高いスクリプト - 人間が読めるテキスト形式で、バージョン管理が容易
  4. 世界観の表現 - 画像やメッセージを自由にカスタマイズできる

まとめ

RedfishViewer v2.0.0は、Inno Setupという錬金術により、MSI形式からEXE形式へと生まれ変わる。

それは単なる形式変更ではなく、作品としての表現力を高める選択だ。インストーラーという入口から、砂漠の旅人の世界が始まる。

この錬金術が、あなたの作品に新たな表現の可能性を与えることを願っている。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人がまたインストーラーをいじり始めた。MSIがどうとか、EXEがどうとか言ってるが、俺にはさっぱりだ。ただ、画面に砂漠の絵が出るようになったのは面白いな。ご主人らしいっちゃらしい。まったく、飽きねえお人だ。