*.NETプログラミング研究 第56号 [#hd949a4d]

**.NET Tips [#r44c7f1c]

***デプロイメントプロジェクトの起動条件エディタの使い方 [#g3af698a]

ここではデプロイメントプロジェクトの「起動条件エディタ」の使い方について説明します。ヘルプでは、「配置での起動条件の管理」で説明されていますので、こちらも参考にしてください。

-[[配置での起動条件の管理>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconlaunchconditionmanagementindeployment.asp]]

デプロイメントプロジェクトの「起動条件エディタ」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件を満たさなければメッセージを表示して、インストールできないようにすることができます。また、指定された条件のファイル、レジストリ、Componentを検索することができます。

起動条件エディタでは、「対象コンピュータ上の検索」と「起動条件」を指定することができます。まずは「起動条件」から説明します。

***起動条件の使い方 [#l935ff60]

「起動条件」では、インストール先のコンピュータが満たすべき必要条件を指定し、条件が満たされなければメッセージを表示して、インストールできないようにすることができます。条件の判断は、インストールの開始時に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのLaunchConditionsアクションを実行している位置です)。ここで使用される条件は通常Propertyの値を使用したものであり、Windows Installerが定義したPropertyや、「対象コンピュータの検索」の結果が入るProperty(詳細後述)等を使用します。なおここで指定された設定は、Windows InstallerデータベースのLaunchConditionテーブルに反映されます。

-[[LaunchCondition Table>http://msdn.microsoft.com/library/en-us/msi/setup/launchcondition_table.asp]]
-[[LaunchConditions Action>http://msdn.microsoft.com/library/en-us/msi/setup/launchconditions_action.asp]]

何はともあれ、「起動条件」をいじってみましょう。デプロイメントプロジェクトで起動条件エディタを表示し、「起動条件」と書かれたノードを右クリックします。表示されるメニューから「起動条件の追加」をクリックすると、起動条件が追加されます。

起動条件のプロパティには、「Condition」、「InstallUrl」、「Message」の3つがあります。このうちConditionに条件を指定し、Messageで条件が満たされずにインストールが失敗した時に表示されるメッセージを指定します。InstallUrlにURLやパス名を指定した場合は、メッセージが表示された後に、指定されたURLやファイルが開きます。ファイルのパスを指定する時は、インストーラの位置からの相対パスで指定します。

-[[起動条件エディタのプロパティ>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconLaunchConditionProperties.asp]]
-[[InstallUrl プロパティ>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxgrfInstallUrlProperty.asp]]

Conditionには、Trueと評価された場合にインストーラが実行されるような条件を指定します。Conditionプロパティはインストールするファイルのプロパティや、レジストリのプロパティにもありますが、使い方はこれらと同じです。ここでははじめに、Conditionをどのように記述すればよいのか解説します。

まずは、Conditionで使用するPropertyとして、Windows Installerが定義したPropertyについて説明します。Windows Installerが定義したプロパティは、「Platform SDK: Windows Installer」で紹介されています。

-[[Platform SDK: Windows Installer - Property Reference>http://msdn.microsoft.com/library/en-us/msi/setup/property_reference.asp]]

以下に、起動条件で使えそうなプロパティを幾つか紹介します。なお、説明は簡単にしているため、正確ではなく、かつWindows Installerのバージョンに依存するものもあります。必ずSDKで確認してください。

#prescroll(wrap=true){{
・Hardware Properties
ColorBits
    画面のピクセル毎の色数(ビット単位)
ScreenX
    画面の幅(ピクセル単位)
ScreenY
    画面の高さ(ピクセル単位)
PhysicalMemory
    インストールされているRAMサイズ(メガバイト単位)
VirtualMemory
    有効なページファイルスペースの大きさ(メガバイト単位)
Alpha
    Alphaプロセッサが動作している場合のプロセッサレベル
Intel
    Intelプロセッサが動作している場合のプロセッサレベル
Intel64
    Itaniumプロセッサが動作している場合のプロセッサレベル
Msix64
    x64プロセッサが動作している場合のプロセッサレベル

・Installation Status Properties
インストーラを実行している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
}}

-[[Operating System Property Values>http://msdn.microsoft.com/library/en-us/msi/setup/operating_system_property_values.asp]]
-[[配置の条件>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconDeploymentConditions.asp]]

また、条件式の文法としては、=、<、>、<>、<=、>=などの比較演算子や、Not、And、Or、Xorなどの論理演算子を使うことができます。詳しくは、次のURLをご覧ください。

-[[Conditional Statement Syntax>http://msdn.microsoft.com/library/en-us/msi/setup/conditional_statement_syntax.asp]]
-[[Using Properties in Conditional Statements>http://msdn.microsoft.com/library/en-us/msi/setup/using_properties_in_conditional_statements.asp]]
-[[条件付き配置>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconConditionalDeployment.asp]]

次にConditionの具体例を紹介します。例えば、Windows 2000 SP4以降をインストールの条件とするならば、次のようにします。

VersionNT>=500 And ServicePackLevel>=4

画面のサイズが800x600以上、色数がHigh Color(16ビット)以上を起動条件とするならば、次のようにします。

ScreenX>=800 And ScreenY>=600 And ColorBits>=16

***ファイル検索 [#w0638afb]

「対象コンピュータ上の検索」では、「ファイル検索」、「レジストリ検索」、「Windows インストーラ検索」を追加することができます。まずは「ファイル検索」について説明します。

「ファイル検索」では、指定された条件のファイルを検索し、見つかれば指定されたPropertyにファイルのパスをセットします。このPropertyを「起動条件」に指定すれば、ファイルが見つかった時、あるいは見つからなかった時のみにインストーラを実行することが出来るようになります。なお、「ファイル検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、DrLocator、Signatureテーブルです。

-[[AppSearch Table>http://msdn.microsoft.com/library/en-us/msi/setup/appsearch_table.asp]]
-[[DrLocator Table>http://msdn.microsoft.com/library/en-us/msi/setup/drlocator_table.asp]]
-[[Signature Table>http://msdn.microsoft.com/library/en-us/msi/setup/signature_table.asp]]

このファイル検索(「対象コンピュータ上の検索」すべて)は、インストーラの開始時、「起動条件」の判断前に行われます(正確には、InstallUISequence table、InstallExecuteSequenceテーブルのAppSearchアクションを実行している位置です)。

-[[AppSearch Action>http://msdn.microsoft.com/library/en-us/msi/setup/appsearch_action.asp]]

ファイル検索をデプロイメントプロパティに追加するには、「対象コンピュータ上の検索」ノードを右クリックし表示されるメニューから「ファイル検索の追加」を選択します。

追加されたファイル検索のプロパティの内、最低指定すべきものは、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」(デフォルト)と入力します。

注.Folderで使用するPropertyについては、「Platform SDK: Windows Installer」の「System Folder Properties」を参考にしてください。

-[[System Folder Properties>http://msdn.microsoft.com/library/en-us/msi/setup/system_folder_properties.asp]]

次にこのファイルが見つかった時のみインストーラが実行できるように、起動条件を追加します。まず先に説明したように「起動条件」を追加し、Conditionに「FILEEXISTS1」と入力し、Messageに適当なメッセージを入力します。

以上で「Msjet40.dll」がシステムフォルダにあるときのみインストーラが実行されるようになります。

ファイルの検索をさらに更新日、サイズ、バージョンで絞り込むこともできます。それには、以下のプロパティを使用しなければなりません。

#prescroll(wrap=true){{
MinDate
    検索するファイルの最も古い更新日時の日付を指定します。つまり、ここで指定した日付と同じか、より新しい更新日時のファイルを検索します。「2005/06/01」のように指定します。
MaxDate
    検索するファイルの最も新しい更新日時の日付を指定します。つまり、ここで指定した日付と同じか、より古い更新日時のファイルを検索します。
MinSize
    検索するファイルの最小サイズをバイト単位で指定します。つまり、ここで指定したサイズと同じか、より大きいサイズのファイルを検索します。
MaxSize
    検索するファイルの最大サイズをバイト単位で指定します。つまり、ここで指定したサイズと同じか、より小さいサイズのファイルを検索します。
MinVersion
    検索するファイルの最小のバージョンを指定します。つまり、ここで指定したバージョンより大きいバージョンのファイルを検索します。「4.0.8015.0」のように指定します。
MaxVersion
    検索するファイルの最大のバージョンを指定します。つまり、ここで指定したバージョンと同じか、より小さいバージョンのファイルを検索します。
}}

***レジストリ検索 [#j39c53d1]

「レジストリ検索」では、指定されたレジストリ値を検索し、見つかれば指定されたプロパティにその値のデータをセットします。なお、「レジストリ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、RegLocatorテーブルです。

-[[RegLocator Table>http://msdn.microsoft.com/library/en-us/msi/setup/reglocator_table.asp]]

レジストリ検索プロパティでは、Rootに検索するレジストリルート、RegKeyに検索するレジストリキー、Valueに検索するレジストリ値、Propertyに見つかったレジストリ値のデータをセットするPropertyを指定します。

レジストリ検索を使用した例としては、MSDNの「Microsoft Data Access Components の起動条件の追加」が参考になります。

-[[Microsoft Data Access Components の起動条件の追加>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxtskAddingLaunchConditionForMicrosoftDataAccessComponents.asp]]

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インストーラ検索 [#h6b8ec6d]

「Windowsインストーラ検索」では、指定されたComponentがコンピュータにインストールされているか調べ、見つかれば指定されたプロパティにComponentがインストールされているフォルダのパスをセットします。なお、「Windowsインストーラ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、CompLocatorテーブルです。

-[[CompLocator Table>http://msdn.microsoft.com/library/en-us/msi/setup/complocator_table.asp]]

Componentとは、Windows Installerがインストール(あるいはアンインストール)する項目の最小の塊とでも言えるでしょうか。詳しい説明は、MSDNをご覧ください。

-[[Component>http://msdn.microsoft.com/library/en-us/vsinstal/html/idh_vedefvisualstudioinstallercomponent.asp]]
-[[Installer Components, Files, and Folders>http://msdn.microsoft.com/library/en-us/vsinstal/html/veconinstallercomponentsfilesfolders.asp]]

「Windowsインストーラ検索」では、検索するComponentのIDを「ComponentID」に指定する必要がありますが、MSDNに書いてあるように、このIDを知る術がVS.NETにはありません。

-[[Windows インストーラ起動条件の追加>http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxtskAddingWindowsInstallerLaunchCondition.asp]]

どうやら、ComponentIDを知るには、Orcaのようなツールを使うしかないようです。OrcaはWindows Installerデータベースの編集を行うためのツールで、Windows Installer SDKに含まれています。

-[[Windows Installer SDK>http://www.microsoft.com/msdownload/platformsdk/sdkupdate/]]

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のコードがあります。

-[[Simple Talk ≫ Blog Archive ≫ Getting started with setup projects>http://www.simple-talk.com/2005/04/25/getting-started-with-setup-projects/]]

***インターネットインフォメーションサービス起動条件 [#ta154dc2]

「対象コンピュータ上の必要条件」ノードを右クリックすることにより表示されるメニューから、「インターネットインフォメーションサービス起動条件の追加」を選択することにより、コンピュータにインターネットインフォメーションサービス(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起動条件 [#w6e884bf]

「インターネットインフォメーションサービス起動条件」と同様の方法により、「.NET Framework起動条件」を追加することができます。.NET Framework起動条件を追加すると、.NET Frameworkがコンピュータにインストールされていなければインストールされないようになります。なお、.NET Framework起動条件は、インストールするアプリケーションが.NET Frameworkを使用していると自動的に追加され、削除できなくなります。

「.NET Framework起動条件」が持つプロパティは次の3つです。SupportedRuntimesプロパティでは、必要な.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の存在をチェックできそうですが、VS.NETではそうしていません。

Orcaを使ってこの「.NET Framework起動条件」が何をしているのか調べてみると、カスタムアクションを使っていることが分かります。まず、Binaryテーブルに「MSVBDPCADLL」というDLLを埋め込みます。CustomActionテーブルにMSVBDPCADLLのCheckFXとVsdLaunchConditionsを呼び出すアクションを登録し、InstallExecuteSequenceとInstallUISequenceテーブルにこれらのアクションを追加します。CheckFXはAppSearchアクションの前、VsdLaunchConditionsはLaunchConditionsアクションの直前に呼び出されます。しかしこれらが具体的に何をしているのかまでは残念ながら分かりません。ちなみに、この「MSVBDPCADLL」が埋め込まれることにより、MSIファイルは200KB以上サイズが大きくなります。

//これより下は編集しないでください
#pageinfo(,2010-03-19 (金) 01:14:54,DOBON!,2010-03-19 (金) 01:14:54,DOBON!)
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]