注意:セットアッププロジェクトはVisual Studio 2012からサポートされなくなりました。
ここではセットアッププロジェクト(デプロイメントプロジェクト)の「起動条件エディタ」の使い方について説明します。ヘルプでは、「配置での起動条件の管理」で説明されていますので、こちらも参考にしてください。
セットアッププロジェクトの「起動条件エディタ」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件を満たさなければメッセージを表示して、インストールできないようにすることができます。また、指定された条件のファイル、レジストリ、Componentを検索することができます。
起動条件エディタでは、「対象コンピュータ上の検索」と「起動条件」を指定することができます。まずは「起動条件」から説明します。
「起動条件」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件が満たされなければメッセージを表示して、インストールできないようにすることができます。条件の判断は、インストールの開始時に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのLaunchConditions Actionを実行している位置です)。ここで使用される条件は通常Propertyの値を使用したものであり、Windows Installerが定義したPropertyや、「対象コンピュータの検索」の結果が入るProperty(詳細後述)等を使用します。なおここで指定された設定は、Windows InstallerデータベースのLaunchCondition Tableに反映されます。
何はともあれ、「起動条件」をいじってみましょう。セットアッププロジェクトで起動条件エディタを表示し(ソリューションエクスプローラでプロジェクトを右クリックし、メニューの[表示]-[起動条件]を選択します)、「起動条件」と書かれたノードを右クリックします。表示されるメニューから「起動条件の追加」をクリックすると、起動条件が追加されます。
起動条件のプロパティには、「Condition」、「InstallUrl」、「Message」などがあります。このうちConditionに条件を指定し、Messageで条件が満たされずにインストールが失敗した時に表示されるメッセージを指定します。InstallUrl プロパティにURLやパス名を指定した場合は、メッセージが表示された後に、指定されたURLやファイルが開きます。ファイルのパスを指定する時は、インストーラの位置からの相対パスで指定します。
Conditionには、Trueと評価された場合にインストーラが実行されるような条件を指定します。Conditionプロパティはインストールするファイルのプロパティや、レジストリのプロパティにもありますが、使い方はこれらと同じです。ここでははじめに、Conditionをどのように記述すればよいのか解説します。
まずは、Conditionで使用するPropertyとして、Windows Installerが定義したPropertyについて説明します。Windows Installerが定義したプロパティは、「Property Reference」などで紹介されています。
以下に、起動条件で使えそうなプロパティを幾つか紹介します。なお、説明は簡単にしているため、正確ではなく、かつWindows Installerのバージョンに依存するものもあります。必ずSDKで確認してください。
Hardware Properties | |
---|---|
ColorBits | 画面のピクセル毎の色数(ビット単位) |
ScreenX | 画面の幅(ピクセル単位) |
ScreenY | 画面の高さ(ピクセル単位) |
PhysicalMemory | インストールされているRAMサイズ(メガバイト単位) |
VirtualMemory | 有効なページファイルスペースの大きさ(メガバイト単位) |
Alpha | Alphaプロセッサが動作している場合のプロセッサレベル |
Intel | Intelプロセッサが動作している場合のプロセッサレベル |
Intel64 | Itaniumプロセッサが動作している場合のプロセッサレベル |
Msix64 | x64プロセッサが動作している場合のプロセッサレベル |
Installation Status Properties | |
VersionMsi | インストーラを実行しているWindows Installerのバージョン |
Operating System Properties | |
Version9X | Windows 9x系の場合、バージョン番号(MajorVersion * 100 + MinorVersion)。Windows 95は400、98は410、Meは490。 |
VersionNT | Windows NT系の場合、バージョン番号(MajorVersion * 100 + MinorVersion)。Windows NT 4.0は400、2000は500、XPは501、Server 2003は502。 |
VersionNT64 | 64-bitコンピュータの場合、OSのバージョン番号(MajorVersion * 100 + MinorVersion) |
WindowsBuild | OSのビルド番号。詳しくは、「Operating System Property Values」。 |
ServicePackLevel | OSのサービスパックのバージョン番号 |
ServicePackLevelMinor | OSのサービスパックのマイナーバージョン番号 |
AdminUser | Windows NT/2000の場合、ユーザーに権利者権限があるか。Windows 95/98の場合は常にセットされる。 |
MsiNTProductType | NT系OSのWindowsプロダクトタイプ。Workstation(またはProfessional)は1、domain controllerは2、Serverは3。 |
VersionDatabase | データベースのバージョン番号 |
MsiNetAssemblySupport | システムがCLRアセンブリをサポートしている場合、fusion.dllのバージョン |
MsiWin32AssemblySupport | システムがWin32アセンブリをサポートしている場合、sxs.dllのバージョン |
ShellAdvtSupport | アドバタイズショートカットをサポートしているか |
SystemLanguageID | システムの言語ID(日本語は"1041") |
User Information Properties | |
UserLanguageID | 現在のユーザーの言語ID |
また、条件式の文法としては、=、<、>、<>、<=、>=などの比較演算子や、Not、And、Or、Xorなどの論理演算子を使うことができます。詳しくは、次のページをご覧ください。
次にConditionの具体例を紹介します。例えば、Windows 2000 SP4以降をインストールの条件とするならば、次のようにします。
VersionNT>=500 And ServicePackLevel>=4
画面のサイズが800x600以上、色数がHigh Color(16ビット)以上を起動条件とするならば、次のようにします。
ScreenX>=800 And ScreenY>=600 And ColorBits>=16
「対象コンピュータ上の検索」では、「ファイル検索」、「レジストリ検索」、「Windows インストーラ検索」を追加することができます。まずは「ファイル検索」について説明します。
「ファイル検索」では、指定された条件のファイルを検索し、見つかれば指定されたPropertyにファイルのパスをセットします。このPropertyを「起動条件」に指定すれば、ファイルが見つかった時、あるいは見つからなかった時のみにインストーラを実行することが出来るようになります。なお、「ファイル検索」で変更されるWindows Installerデータベーステーブルは、AppSearch Table、DrLocator Table、Signature Tableテーブルです。
このファイル検索(「対象コンピュータ上の検索」すべて)は、インストーラの開始時、「起動条件」の判断前に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのAppSearch Actionを実行している位置です)。
ファイル検索をセットアッププロジェクトに追加するには、「対象コンピュータ上の検索」ノードを右クリックし表示されるメニューから「ファイル検索の追加」を選択します。
追加されたファイル検索のプロパティの内、最低指定すべきものは、FileName、Folder、Depth、Propertyとなるでしょう。FileNameに検索するファイルの名前、Folderにファイルを検索するフォルダ、DepthにFolderでファイルを検索する深さ(0以上の整数、0でそのフォルダのみ検索)、Propertyに見つかったファイルのパスをセットするProperty名(注)を指定します。
注:Propertyには定義済みのWindows Installerプロパティまたはカスタムプロパティを指定できますが、カスタムプロパティでは大文字を使用する必要があります。
次に具体例を示します。「Msjet40.dll」というファイルがシステムフォルダに存在しているか調べ、なければインストールできないようにしてみましょう。
まず上記のようにファイル検索をプロジェクトに追加します。そして、FileNameプロパティに「Msjet40.dll」、Folderプロパティに「[SystemFolder]」(注)、Depthに「0」、Propertyに「FILEEXISTS1」(デフォルト)と入力します。
注:[SystemFolder]以外にFolderで使用できるPropertyについては、「Platform SDK: Windows Installer」の「System Folder Properties」を参考にしてください。
次にこのファイルが見つかった時のみインストーラが実行できるように、起動条件を追加します。まず先に説明したように「起動条件」を追加し、Conditionに「FILEEXISTS1」と入力し、Messageに適当なメッセージを入力します。
以上で「Msjet40.dll」がシステムフォルダにあるときのみインストーラが実行されるようになります。
ファイルの検索をさらに更新日、サイズ、バージョンで絞り込むこともできます。それには、以下のプロパティを使用しなければなりません。
プロパティ | 説明 |
---|---|
MinDate | 検索するファイルの最も古い更新日時の日付を指定します。つまり、ここで指定した日付と同じか、より新しい更新日時のファイルを検索します。「2005/06/01」のように指定します。 |
MaxDate | 検索するファイルの最も新しい更新日時の日付を指定します。つまり、ここで指定した日付と同じか、より古い更新日時のファイルを検索します。 |
MinSize | 検索するファイルの最小サイズをバイト単位で指定します。つまり、ここで指定したサイズと同じか、より大きいサイズのファイルを検索します。 |
MaxSize | 検索するファイルの最大サイズをバイト単位で指定します。つまり、ここで指定したサイズと同じか、より小さいサイズのファイルを検索します。 |
MinVersion | 検索するファイルの最小のバージョンを指定します。つまり、ここで指定したバージョンより大きいバージョンのファイルを検索します。「4.0.8015.0」のように指定します。 |
MaxVersion | 検索するファイルの最大のバージョンを指定します。つまり、ここで指定したバージョンと同じか、より小さいバージョンのファイルを検索します。 |
「レジストリ検索」では、指定されたレジストリ値を検索し、見つかれば指定されたプロパティにその値のデータをセットします。なお、「レジストリ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、RegLocator Tableです。
レジストリ検索プロパティでは、Rootに検索するレジストリルート、RegKeyに検索するレジストリキー、Valueに検索するレジストリ値、Propertyに見つかったレジストリ値のデータをセットするPropertyを指定します。
レジストリ検索を使用した例としては、MSDNの「Microsoft Data Access Components の起動条件の追加」が参考になります。
MDAC2.7以上がインストールされていることを起動条件とするには、次のようにします。まず、「対象コンピュータ上の検索」ノードを右クリックし表示されるメニューから「レジストリ検索の追加」を選択します。追加されたレジストリ検索のプロパティのRootを「vsdrrHKLM」、RegKeyを「Software\Microsoft\DataAccess」、Valueを「FullInstallVer」、Propertyを「REGISTRYVALUE1」(デフォルト)と変更します。これでレジストリキー「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess」に「FullInstallVer」という値があったときにそのデータが「REGISTRYVALUE1」にセットされます。このREGISTRYVALUE1が2.7以上であることを起動条件とするために、Conditionが「REGISTRYVALUE1>="2.7"」という起動条件を追加します。
「Windowsインストーラ検索」では、指定されたComponentがコンピュータにインストールされているか調べ、見つかれば指定されたプロパティにComponentがインストールされているフォルダのパスをセットします。なお、「Windowsインストーラ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、CompLocator Tableです。
Componentとは、Windows Installerがインストール(あるいはアンインストール)する項目の最小の塊とでも言えるでしょうか。詳しい説明は、MSDNの「Visual Studio Installer Component」や「Installer Components, Files, and Folders」等をご覧ください。
「Windowsインストーラ検索」では、検索するComponentのIDを「ComponentID」に指定する必要がありますが、MSDN「方法 : Windows インストーラ起動条件を追加する」に書いてあるように、このIDを知る術がVisual Studioにはありません。
どうやら、ComponentIDを知るには、Orcaのようなツールを使うしかないようです。
IDを調べたいComponentのあるMSIファイルをOrcaで開き、Componentテーブルを開くと、登録されているComponentが表示されます。このComponentID列にある文字列が目的のComponentIDです。例えば、あるファイルがどのComponentに属しているか調べるには、Fileテーブルで調べたいファイルを見つけ、そのComponent_列のIDで示されるComponentを探せばよいわけです。
このようにして見つけたComponentIDを「Windowsインストーラ検索」のComponentIDプロパティに指定することにより、そのComponentがインストールされているか検索することができます。
補足:現在コンピュータにインストールされているComponentを調べるには、WindowsInstaller.InstallerオブジェクトのComponentsプロパティを調べることにより可能です。この方法は、「Simple Talk ≫ Blog Archive ≫ Getting started with setup projects」で紹介されており、コンピュータにインストールされているすべてのComponentを列挙するVBScriptのコードがあります。
ルートノードの「対象コンピュータ上の必要条件」ノードを右クリックすることにより表示されるメニューから、「インターネットインフォメーションサービス起動条件の追加」を選択することにより、コンピュータにインターネットインフォメーションサービス(IIS)がインストールされていることを起動条件に追加することができます。
実際にインターネットインフォメーションサービス起動条件の追加を行うと、「対象コンピュータの検索」にレジストリキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters」の「MajorVersion」値を検索する設定が追加され、「起動条件」に検索された値が4以上(Conditionが「REGISTRYVALUE1 >= "#4"」)とする設定が追加されます。
補足:「REGISTRYVALUE1 >= "#4"」の「#」は、取得されるレジストリ値の型がDWORDとなるために付ける必要があります。「RegLocator Table」のRemarksをご覧ください。
このようにデフォルトではIISのバージョンが4以上を起動条件としますが、これを変更する時は、「起動条件」のConditionの「4」を適当な数字に変更します。
「インターネットインフォメーションサービス起動条件」と同様の方法により、「.NET Framework起動条件」を追加することができます。.NET Framework起動条件を追加すると、.NET Frameworkがコンピュータにインストールされていなければインストールされないようになります。なお、.NET Framework起動条件は、インストールするアプリケーションが.NET Frameworkを使用していると自動的に追加され、削除できなくなります。
「.NET Framework起動条件」が持つプロパティは次の3つです。SupportedRuntimesプロパティ(VS2005では、Versionプロパティ)では、必要な.NET Frameworkのバージョンを指定します。バージョンを複数指定するには、それぞれをセミコロンで区切ります。例えば、.NET Framework 1.0と1.1のどちらかがインストールされていることを起動条件とするならば、「1.1.4322;1.0.3705」とします。InstallUrlには、指定された.NET Frameworkがインストールされていなかった時に表示するURLやファイルのパスを指定します(注)。通常は、.NET Framework再頒布可能パッケージがダウンロードできるURLや、dotnetfx.exeへのパスを指定します。Messageには、指定された.NET Frameworkがインストールされていなかった時に表示するメッセージを指定します。
注:指定された.NET Frameworkがインストールされていない時、Messageプロパティを変更していなければ、「このセットアップは.NET Framework バージョン X.X.XXXXX を必要とします。.NET Frameworkをインストールして、このセットアップをやり直してください。.NET FrameworkはWebから取得できます。今すぐ取得しますか?」というメッセージと、「はい」「いいえ」ボタンを持つダイアログが表示されます。ここでユーザーが「はい」を選択した場合のみInstallUrlが表示されます。InstallUrlを省略した時は、「このセットアップは.NET Framework バージョン X.X.XXXXX を必要とします。.NET Frameworkをインストールして、このセットアップをやり直してください。」というメッセージと、「OK」ボタンのみのダイアログが表示されます。
補足:ところで、「インストール前に.NET Frameworkをインストールする」で紹介したように、.NET Frameworkがインストールされているかどうかはレジストリを調べて判断することができますので、「インターネットインフォメーションサービス起動条件」と同様にレジストリ検索と起動条件を使って.NET Frameworkの存在をチェックできそうですが、VSではそうしていません。
Orcaを使ってこの「.NET Framework起動条件」が何をしているのか調べてみると、カスタムアクションを使っていることが分かります。まず、Binaryテーブルに「MSVBDPCADLL」というDLLを埋め込みます。CustomActionテーブルにMSVBDPCADLLのCheckFXとVsdLaunchConditionsを呼び出すアクションを登録し、InstallExecuteSequenceとInstallUISequenceテーブルにこれらのアクションを追加します。CheckFXはAppSearchアクションの前、VsdLaunchConditionsはLaunchConditionsアクションの直前に呼び出されます。しかしこれらが具体的に何をしているのかまでは残念ながら分かりません。ちなみに、この「MSVBDPCADLL」が埋め込まれることにより、MSIファイルは200KB以上サイズが大きくなります。
(この記事は、「.NETプログラミング研究」の第56号で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。