InstallShield LE for VisualStudioによるアップデートインストールの作成

# はじめに
不具合によるアプリケーションの改修でInstallShield LEを使ってインストーラーを作り直したところ、「プログラムと機能」に同じアプリの2つのバージョンが表記されてしまった。

以前の仕様変更の際にインストーラーを作り直した時には、そのようにならなかったので自宅環境で調査しました。

:::note alert
2021年12月14日 InstallShield LE は廃止されました。
https://community.flexera.com/t5/InstallShield-News/Product-Announcement-InstallShield-Limited-Edition-Discontinued/ba-p/217448
:::

# InstallShield LEとは
Flexera Software社がVisual Studioユーザー向けに無償で提供している製品となります。`LE`は`Limited Edition`の略称で機能に制限があります。

InstallShield LEは、Visual Studio Community 2013では使えたのですが、Visual Studio Community 2015から使えなくなってしまいました。
MicrosoftのVisual Studio Installer(インストーラー プロジェクト)は、Visual Studio 2012 からサポートされなくなっていましたが、今は復活してVisual Studio Communityでも使用できるようになっています。Visual Studioの[ツール] - [拡張機能と更新プログラム] で、`installer`を検索すればいいです。

Visual Studio Professional 以上を持っているなら、InstallShield LEを有効化すれば使えます。

>64bitのPCでInstallShield Limited Editionを使っている場合、64bit版のmsiのインストーラーしか作ることができません
[InstallShield Limited Edition(インストールシールド LE)の使い方、制限、比較、64bit対応、日本語化](https://urashita.com/archives/903)

そんなことはなく、64bit環境でインストーラーを作成しても、32bit環境でインストールできました。条件など作り方によったのかも知れませんね。
[VS2013 InstallShield LE 32/64bit版のインストーラ作成方法について MSDNフォーラム](https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/33b96110-2d3d-46bc-8a73-9e960b6057b6/vs2013-installshield-le-3264bit?forum=vsgeneralja)



# 検証環境
* Windows 10 Home 64bit
* Visual Studio 2010 Ultimate
* InstallShield 2015 Limited Edition for Visual Studio

自宅環境でVisual Studio 2017 CommunityにはInstallShield LEがインストール出来ないため、Visual Studio 2010 Ultimateと古い環境で使用しています。

# アップデートインストールの作成
InstallShield LEでは、マイナーアップグレードやパッチ作成はサポートしておらず、メジャーアップグレードと呼ばれる形式のアップデートパターンしか提供していません。
`Product Version`と`Product Code(GUID再生成)`を変更することで、メジャーアップグレード形式となり、「プログラムと機能」に同じアプリの複数のバージョンが並ぶことになります。

ちなみに、`Product Version`のみ変更して`Product Code`を変更しないと「別のバージョンの製品が既にインストールされています。このバージョンのインストールを続行できません」と表示され、最初のソフトをアンインストールするように言われてしまいます。

アップデートインストールを作成するには、下記サイトを参考にします。
※アップデートインストールといっても、以前のバージョンを自動削除する方式となりますので、アンインストール時のカスタムアクションは動作します。

* [VisualStudio の Install ShielｄLimited Edition 2013 でアップデートインストール](https://tenshil.blogspot.jp/2015/11/visualstudio-install-shiellimited.html)
* [InstallShield > tips > アップデートを管理させる手順 - 豚吐露＠wiki ](https://www21.atwiki.jp/ohden/pages/587.html)

重要なポイントは、`Product Version`と`Product Code(GUID再生成)`を変更するだけでなくアップグレードの管理機能の設定(Upgrade Paths)が必要だということです。

1. [①Organize Your Setup]-[Upgrade Paths]を選択します。
2. `Upgrade Paths` を右クリックして、「New Upgrade Path...」メニューを選択します。
3. ファイル選択ダイアログが表示されますが、「キャンセル」ボタンで閉じると、新しいアップグレードエントリが作成されます。
4. アップグレードの新しいノードには「Upgrade」のような名前を付けます。
5. プロパティの `Max Version` には、新しいバージョンをセットします。

プロパティの`Include Max Version` は、アップグレードの際に以前のバージョンを削除する最大バージョン情報を含めるかどうかを示しています。ここは`No`でいいと思います。

![InstallShieldLE.png](https://qiita-image-store.s3.amazonaws.com/0/14053/dd7bce6f-0164-f371-e656-07c68ef64a76.png)

# 検証
アップデートインストールの作成に従って作成したにもかかわらず、「プログラムと機能」に同じアプリの2つのバージョンが表記されてしまったので、この原因を調査しました。

アプリケーションはWindowsフォームにボタンを追加しただけの`InstallTest`を作成したもので、検証としてアプリケーションとセットアップ(SingleImageのsetup.exe)のバージョンを下記のように複数作成しました。

* 1.0.0.0
* 1.0.0.1
* 1.0.1.0
* 1.0.2.0
* 1.1.0.0
* 1.1.0.1
* 1.1.1.0

インストールするたびに「プログラムと機能」の表示と念のために下記サイトにあるバッチプログラムを使ってレジストリから一覧を取得して確認しました。
[【Windows】コマンドでインストール済みのソフト一覧を取得する方法](http://rukifiel.net/ms-dos-001/)

# 検証結果
`1.0.0.0`をインストールし、`1.0.0.1`をインストールすると2つのバージョンが残りました。その後に、`1.0.1.0`をインストールすると`1.0.1.0`のみが残りました。
`1.0.2.0`をインストールすると`1.0.2.0`のみが残りました。`1.1.0.0`をインストールすると`1.1.0.0`のみが残りました。

この結果から、末尾バージョンを変更しただけだと残ることが分かりました。
念のため、`1.1.0.1`をインストールすると2つのバージョンが残りました。

![InstalResult.png](https://qiita-image-store.s3.amazonaws.com/0/14053/6ac8a4e1-e568-9313-7fe7-70dc5803775c.png)

`1.1.1.0`をインストールすると2つのバージョンが消え、`1.1.1.0`のみが残りました。
![InstalResult2.png](https://qiita-image-store.s3.amazonaws.com/0/14053/f1bd8b1c-b045-e311-eae3-6e14beb25891.png)

確かに会社でインストーラーを作り直した際に、不具合だったので末尾バージョンのみを変更していました。

# バージョン番号の付け方
バージョン番号の付け方は、会社や個人によって付け方が違っていると思う。
今回は4つの数値でバージョン番号を記述しており、不具合は末尾バージョンのみを変更、小さめの仕様変更は、3つ目のバージョンを変更するという独自ルールにしていた。

## 見直し
今回の件で、改めてバージョン番号の付け方の見直しが必要です。

<メジャー・バージョン>.<マイナー・バージョン>.<ビルド番号>.<リビジョン>

.NETではAssemblyVersionの指定に"1.0.*"のようにアスタリスクを指定した場合、[.NET Framework クラス ライブラリ リファレンスのAssemblyVersionAttribute クラス](http://www.weblio.jp/content/AssemblyVersionAttribute)によると、ビルド番号は現地時間 2000年1月1日からの経過日数になり、リビジョンは現地時間の深夜からの経過秒数を 2 で割った値になります。

「プログラム.NET Framework」という書籍によると、ビルド番号は、たとえばアセンブリを毎日ビルドするのであれば、この番号も毎日１ずつ増加させ、リビジョン番号は、ビルドの改定番号を表し、何らかの理由（不具合修正等）でその日のうちにアセンブリを何度もビルドしなければならなくなった場合に、リビジョン番号を１ずつ増加させていくようです。 
この方法は推奨というだけで、開発者自身が好みで付けてもかまわないようです。 

いずれにしても、末尾バージョンはリリース時には使わない方針にしていく。

* [意外と知らないバージョン表記・数字の豆知識](http://www.atmarkit.co.jp/ait/articles/1003/26/news106.html)
* [Apple のバージョン番号の付け方](http://sazameki.jp/?p=115)
* [ソフトを作成する上でのバージョン番号のつけ方に悩む・・](http://sourcechord.hatenablog.com/entry/20070308/1173307164)

TeXのバージョンは、3.1，3.14，3.141，と円周率に近づくようにしているってのは面白いですね。
https://ja.wikipedia.org/wiki/TeX


# アンインストール後のフォルダ完全削除
以前、アンインストールした際にインストールしたフォルダと中身のファイルを削除して欲しいという要望がありました。インストーラーのアンインストールは、インストールした時点のファイルは削除してくれますが、その後に追加されたファイルは残ってしまいます。ファイルがあると当然フォルダも残ります。
だから、`Program Files`フォルダは通常は書き込みがしないようにしているんですね。企業によっては`Program Files`フォルダは書き込めないので、専用フォルダでプログラムと設定ファイルとログを管理したいということです。

その場合、インストーラーのカスタムアクションを使ってアンインストール時にスクリプト等を実行させます。
InstallShield LEは、素直にカスタムアクションで削除できたのですが、Visual Studio Installerは、CustomAction.dllが使用中となり削除できませんでした。その為、Uninstallメソッドにて削除バッチファイルをテンポラリフォルダにコピーして、バッチで10秒後にフォルダごと削除させるというトリッキーな方法をとりました。

# 最後に
アップデートインストールの作成方法は以前調べて分かっていたのに、バージョン番号の付け方に問題があったのは盲点でした。

これで次からは迷うこと無くアップデートインストーラーを作成できます。

InstallShield LEについて書こうと思ったことを、ついでに書いてしまいました。

# 参照
* [InstallShield LE for VisualStudioをいろいろ試したので備忘録](https://qiita.com/__907/items/46ec74791a54223f437c)
* [【VisualStudio】InstallShield Limited Editionを用いたインストーラの作成](http://dev.classmethod.jp/tool/hello_installshield/)
* [マイナーアップグレードとメジャーアップグレードの作成方法 pdf](
http://cabi.networld.co.jp/faq/installshield/00001473/upgrade.pdf)
* [メジャーアップグレードの作成方法（Express Edition）pdf](
http://cabi.networld.co.jp/faq/installshield/00001473/upgradeExpress.pdf)
* [VisualStudio の Install ShielｄLimited Edition 2013 でアップデートインストール](https://tenshil.blogspot.jp/2015/11/visualstudio-install-shiellimited.html)
* [InstallShield Limited Edition の使い方](http://ohwhsmm7.blog28.fc2.com/blog-entry-415.html)
* [Application > InstallShield > 使い方 豚吐露＠wiki](https://www21.atwiki.jp/ohden/pages/581.html)
* [InstallShield 2015 Limited Edition for Visual Studio 2015 の有効化とインストール](https://www.ipentec.com/document/document.aspx?page=installshield-2015-limited-edition-for-vs2015-enabled)
* [VisualStudio の Install ShielｄLimited Edition 2013 でアップデートインストール]
(https://tenshil.blogspot.jp/2015/11/visualstudio-install-shiellimited.html)