ここまでサービスとアプリケーションプロジェクトによる、写真ファイルを振り分けするソフトを作成しました。
これらのソフトを配布するためにインストーラを作成します。

概要
  • Setup Projectの使用
  • サービスの登録とファイル配布
  • ライセンスについて

インストール後は、写真ファイルの振り分けまで確認します。

Setup Projectの作成

Visual Studio 2022のSetup Projectは拡張機能に含まれています。

Visual Studio 2022のメニューより「拡張機能」-「拡張機能の管理」を選択します。

拡張機能の検索枠に「setup」を入力します。
Microsoft Visual Studio Installer Project 2022を選択し、インストールを行います。

画面では「インストール済み」ですが、「インストール」ボタンをクリックしてください。

インストール前にVisual Studio 2022を終了するよう促されます。
Visual Studio 2022を終了するとインストールが開始します。

一部のソフトウェアが起動している場合は先に進まないため、対象を終了してください。
私の場合は「node.js」の終了が必要でした。

インストール完了後、写真振り分けソフトのソリューションを開き「追加」-「新しいプロジェクト」を選択します。

検索枠に「setup」と入力します。
Setup Projectを選択し、「次へ」をクリックします。

プロジェクト名は任意ですが、「setup_prj」としました。
「作成」をクリックします。

Setup Projectが作成され、デフォルトの画面が表示します。
ここに配布するファイルの追加や設定を行っていきます。

インストーラの作成

Setup Projectを操作して写真ファイル振り分けソフトのインストーラを作成します。

配布ファイルの登録

配布するファイルをSetup Projectに登録する前に、サービスと登録用アプリケーションの配布物・Release(リリース)を作成します。

メニューより「ビルド」-「構成マネージャー」を選択します。

構成マネージャー画面よりアクティブソリューション構成を「Release」に変更します。
サービスおよび登録用アプリケーションのプロジェクトがReleaseになることを確認し、「閉じる」をクリックします。

サービスおよび登録用アプリケーションのプロジェクトをビルドすると[bin]-[Release]フォルダにビルドファイルが出力されます。
こちらが配布するファイルです。

プロジェクト(setup_prj)を右クリックし、[View]-[ファイルシステム]の順に選択します。

File Systemウインドウにて[File System on Target Machine]-[Application Folder]を右クリックします。
[Add]-[ファイル]の順に選択します。

先ほどビルドしたサービスプロジェクトのReleaseフォルダより、実行ファイル(photo_sorting.exe)および(photo_sorting.config)の2ファイルを選択します。

Application Folderの一覧に追加されることを確認します。
このとき、依存関係ファイルも同時に追加されます。

同様にビルドした登録用アプリケーションのReleaseフォルダより、実行ファイル(setting_app.exe)および(setting_app.config)の2ファイルを選択します。

Application Folderの一覧に追加されることを確認します。

配布するファイルを設定できました。続けてアイコンファイルを追加します。

File Systemウインドウにて[File System on Target Machine]-[Application Folder]を右クリックします。
[Add]-[ファイル]の順に選択し、同様にアイコンファイルを選択します。

追加したアイコンファイル右クリックし、[プロパティウインドウ]を選択します。

プロパティよりExcludeをTrueに変更します。
こうすることでiconファイルは配布先から除外されます。
アイコンファイルはショートカットの指定などで使用します。

配布先からの除外はその後の「使用許諾契約」ファイルでも行います。

スタートメニュー登録

スタートメニューから起動するため、ショートカットを追加します。

User’s Program Menuを右クリックし、[Add]-[Folder]の順に選択します。

「New Folder #%d1」というフォルダが作成することを確認し、このフォルダを「写真振り分けソフト」にリネームします。

「写真振り分けソフト」フォルダを選択し、画面右の一覧を右クリックします。
[新しいショートカットの作成]を選択します。

Select Item in Project画面にて、Application Folderをダブルクリックします。
中の「setting_app.exe」を選択して「OK」をクリックします。

「Shortcut to %ssetting_app.exe」という項目が作成することを確認し、これを「登録用アプリケーション」にリネームします。

リネームした「写真振り分けソフト」や「登録用アプリケーション」はスタートメニュー表示する名前のため、好きな名前にして構いません。

「登録用アプリケーション」を右クリックし、[プロパティウインドウ]を選択します。

Iconより(Blowse…)を選択します。

Icon画面にて「Blowse…」をクリックします。

Select Item in Project画面よりApplication Folderを選択します。
アイコンファイルを選択して「OK」をクリックします。

Current icon枠にアイコンが表示されることを確認し、選択して「OK」をクリックします。

サービスの登録

サービスはアプリケーションと異なりインストールで登録、アンイストールで削除する必要があります。

ソリューションエクスプローラーよりプロジェクト(setup_prj)を右クリックし、[View]-[カスタム動作]を選択します。

Custom Actionsを右クリックし、[カスタム動作の追加]を選択します。

Select Item in Project画面よりサービスプログラムの実態(photo_sorting.exe)を選択し、「OK」をクリックします。

photo_sorting.exeがそれぞれのカスタム動作に追加されます。
これでインストール・アンイストールするとサービスの追加と削除を行ってくれます。

ユーザーインタフェース

インストーラのユーザーインタフェースに関する部分を設定します。

プロジェクト(setup_prj)を右クリックし、[View]-[ユーザーインタフェース]を選択します。

User Interface画面より、[Install]-[インストールフォルダー]のプロパティウインドウを表示します。

InstallAllUsersVisibleをFalseにします。
すべてのユーザー/固有のユーザーのインストール選択が無くなり、すべてのユーザーにインストールが適用されます。

Startを右クリックし、[ダイアログの追加]を選択します。

Add Dialog画面にて[ライセンス条項]を選択し、「OK」クリックします。

追加した「ライセンス条項」を「ようこそ」の次に表示するよう、ドラッグアンドドロップして移動します。

ライセンス条項のプロパティウインドウを表示します。
LicenseFileの項目にて使用許諾書のファイルを指定します。

使用許諾書.rtfはワードパッドで作成したテキストファイル(.rtf)を指定します。
検索するとサンプルなどの情報がありますので作成します。
使用許諾書.rtfの追加方法はアイコンファイルの追加と同様のため割愛します。

Administrative Install側も同様に「ライセンス条項」を追加します。

プロパティ設定

プロパティを設定して調整します。
プロジェクト(setup_prj)を右クリックし、[プロパティ]を選択します。

プロパティページにて「Prerequisites…」をクリックします。

必須コンポーネント画面にて、Microsoft.NET Framework 4.7.2(x86およびx64)がチェックされていることを確認します。
チェックされていない場合はチェックしてから「OK」をクリックします。

プロジェクト(setup_prj)を選択した状態でプロパティウインドウを開きます。
次のプロパティを変更します。

プロパティ説明
AddRemoveProgramsIconアイコンを指定アプリケーションの追加と削除で表示するアイコン
Authors-skインストーラの作成者
Description写真振り分けソフトインストーラの説明
InstallAllUsersTrue全ユーザー共通/個別ユーザー
Manufacturers-skアプリケーションの作成者
ProductName写真振り分けソフトアプリケーションの名前
RemovePreviousVersionsTrue旧バージョンを削除する/しない
Title写真振り分けソフトインストーラのタイトル

File SystemよりApplication Folderを右クリックし、[プロパティウインドウ]を選択します。

DefaultLocationを選択し、「[ProgramFilesFolder]¥PhotoSorting」と変更します。
DefaultLocationはデフォルトのインストールファイル配布先フォルダです。

動作確認

インストールから動作まで確認します。
プロジェクト(setup_prj)をビルドすると次の2ファイルを出力します。

setup.exeをダブルクリックするとインストーラが起動します。
「次へ」をクリックして先に進みます。

「ライセンス条項」の表示、使用許諾契約内容が確認できました。
[同意する]を選択し、「次へ」をクリックします。

インストールフォルダーの選択ではデフォルトのインストール先が正しいことを確認します。
また、すべてのユーザー/個別のユーザーの選択が出てこないことを確認します。
「次へ」をクリックします。

インストールの確認ではそのまま「次へ」をクリックします。
インストールが開始します。

ユーザーアカウント制御画面では「はい」をクリックします。

発行元を信頼済にする場合は「コードサイニング証明書」が必要です。
コードサイニング証明書の取得は高価ですが、配布するには信頼済が望ましいです。

インストールの完了後に「閉じる」をクリックします。

サービス(photo_sorting)を確認すると「停止中」でした、インストール直後は自動で起動してくれませんでした。
OSを再起動して起動確認をします。
再起動後はサービス(photo_sorting)が起動しました。

スタートメニューより登録用アプリケーションを起動します。
どういうわけかアイコンが変わっていないですがそのまま進めます。

登録用アプリケーションが起動しました。
振り分けをテストする設定を行い、「更新」をクリックしてみます。

登録に失敗してしまいました。

このままでは先に進めないためログを確認してみます。すると、ログそのものが作成できていませんでした。
原因は登録用アプリケーションの起動ユーザーがインストール先フォルダの書き込み権限をもっていないため、ファイルアクセスに失敗していました。

一時的な回避策として、登録用アプリケーションを一旦終了後に「管理者起動」します。

スタートメニューの「登録用アプリケーション」を右クリックし、[その他]-[管理者として実行]を選択すると、管理者起動します。

再度書き込みを行い、正しく更新することができました。

振り分けのテストを行います。
整頓されず置きっぱなしの昔のデジカメファイル(2006ファイル:11GB)を振り分け元フォルダにコピーします。

30秒以上待機して・・・振り分けされる動きがありません・・・
再度ログを確認すると、振り分け以前に設定更新のログもありませんでした。(登録を上手く読み取っていない?)
どうやら登録ファイル(setting.json)が存在しない状態でサービスが起動すると、登録変更を検知できてない模様です。

原因調査は別の機会にして、登録ファイル(setting.json)を作成した状態でサービスを起動します。
今度は読み込みしました。

再度、デジカメファイルをコピーしてみると・・・振り分けが行われました。

一通りの動作確認ができましたので、アンイストールを確認します。
アプリケーションの追加と削除を表示します。
ここでも何故かアイコンが正しく変更していませんが、先に進みます。

写真振り分けソフトをアンイストールします。
アンイストールの確認メッセージで「はい」をクリックします。

インストール時と同様にユーザーアカウント制御では「はい」をクリックします。
アンイストールが開始します。

サービスのアンイストールが行われるまで、少し時間がかかる場合があります。

アンイストールが正しく行われました。
配布は「setup.exe」ファイルと「setup_prj.msi」ファイルを配ればよさそうです。

まとめ

4ステップに分けて写真ファイルを振り分けするソフトを作成してきました。
個人・無料の範囲でソフトを作成したのは初めてですが、作成する楽しみについて少しでも伝わっていただければ嬉しいです。

バグを含めて色々問題がありましたので、改善後にフリーウェア申請にもトライしてみようと思います。

宿題

今回見つかった問題

  • スタートメニューのアイコンが設定がされない
  • プログラムの追加と削除アイコンが設定されない
  • 登録用アプリケーションの起動権限によりファイルアクセスできない
  • コードサイニング証明書が無いことによる発行元不明の表示(費用問題)
  • インストール直後はサービスが起動しない問題(OSの再起動で回避)
  • 登録ファイル(setting.json)がない状態でサービスを起動すると更新判定できない(バグ)

前回までの問題

  • 30秒でコピーが行われない場合の対応
  • FileSystemWatcherのエラー処理
  • 空フォルダの削除
  • パフォーマンス設定の対応