VisualStudio
installer
InstallShield

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

はじめに

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

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

InstallShield LEとは

Flexera Software社がVisual Studioユーザー向けに無償で提供している製品となります。LELimited 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対応、日本語化

そんなことはなく、64bit環境でインストーラーを作成しても、32bit環境でインストールできました。条件など作り方によったのかも知れませんね。
VS2013 InstallShield LE 32/64bit版のインストーラ作成方法について MSDNフォーラム

検証環境

  • 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 VersionProduct Code(GUID再生成)を変更することで、メジャーアップグレード形式となり、「プログラムと機能」に同じアプリの複数のバージョンが並ぶことになります。

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

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

重要なポイントは、Product VersionProduct 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

検証

アップデートインストールの作成に従って作成したにもかかわらず、「プログラムと機能」に同じアプリの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】コマンドでインストール済みのソフト一覧を取得する方法

検証結果

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

1.1.1.0をインストールすると2つのバージョンが消え、1.1.1.0のみが残りました。
InstalResult2.png

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

バージョン番号の付け方

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

見直し

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

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

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

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

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

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について書こうと思ったことを、ついでに書いてしまいました。

参照