┏第56号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・デプロイメントプロジェクトの起動条件エディタの使い方 ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●デプロイメントプロジェクトの起動条件エディタの使い方 ここではデプロイメントプロジェクトの「起動条件エディタ」の使い 方について説明します。ヘルプでは、「配置での起動条件の管理」で 説明されていますので、こちらも参考にしてください。 [URL]配置での起動条件の管理 http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconlaunchconditionmanagementindeployment.asp デプロイメントプロジェクトの「起動条件エディタ」では、インストー ル先のコンピュータが満たすべき必要条件を指定し、条件を満たさな ければメッセージを表示して、インストールできないようにすること ができます。また、指定された条件のファイル、レジストリ、 Componentを検索することができます。 起動条件エディタでは、「対象コンピュータ上の検索」と「起動条件」 を指定することができます。まずは「起動条件」から説明します。 ★起動条件の使い方 「起動条件」では、インストール先のコンピュータが満たすべき必要 条件を指定し、条件が満たされなければメッセージを表示して、イン ストールできないようにすることができます。条件の判断は、インス トールの開始時に行われます(正確には、InstallUISequence table、 InstallExecuteSequenceテーブルのLaunchConditionsアクションを実 行している位置です)。ここで使用される条件は通常Propertyの値を 使用したものであり、Windows Installerが定義したPropertyや、「対 象コンピュータの検索」の結果が入るProperty(詳細後述)等を使用 します。なおここで指定された設定は、Windows Installerデータベー スのLaunchConditionテーブルに反映されます。 [URL]LaunchCondition Table http://msdn.microsoft.com/library/en-us/msi/setup/launchcondition_table.asp [URL]LaunchConditions Action http://msdn.microsoft.com/library/en-us/msi/setup/launchconditions_action.asp 何はともあれ、「起動条件」をいじってみましょう。デプロイメント プロジェクトで起動条件エディタを表示し、「起動条件」と書かれた ノードを右クリックします。表示されるメニューから「起動条件の追 加」をクリックすると、起動条件が追加されます。 起動条件のプロパティには、「Condition」、「InstallUrl」、「 Message」の3つがあります。このうちConditionに条件を指定し、 Messageで条件が満たされずにインストールが失敗した時に表示され るメッセージを指定します。InstallUrlにURLやパス名を指定した場 合は、メッセージが表示された後に、指定されたURLやファイルが開 きます。ファイルのパスを指定する時は、インストーラの位置からの 相対パスで指定します。 [URL]起動条件エディタのプロパティ http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconLaunchConditionProperties.asp [URL]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」で紹介され ています。 [URL]Platform SDK: Windows Installer - Property Reference http://msdn.microsoft.com/library/en-us/msi/setup/property_reference.asp 以下に、起動条件で使えそうなプロパティを幾つか紹介します。なお、 説明は簡単にしているため、正確ではなく、かつWindows Installer のバージョンに依存するものもあります。必ずSDKで確認してくださ い。 ・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 [URL]Operating System Property Values http://msdn.microsoft.com/library/en-us/msi/setup/operating_system_property_values.asp [URL]配置の条件 http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxconDeploymentConditions.asp また、条件式の文法としては、=、<、>、<>、<=、>=などの比較演算 子や、Not、And、Or、Xorなどの論理演算子を使うことができます。 詳しくは、次のURLをご覧ください。 [URL]Conditional Statement Syntax http://msdn.microsoft.com/library/en-us/msi/setup/conditional_statement_syntax.asp [URL]Using Properties in Conditional Statements http://msdn.microsoft.com/library/en-us/msi/setup/using_properties_in_conditional_statements.asp [URL]条件付き配置 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 ★ファイル検索 「対象コンピュータ上の検索」では、「ファイル検索」、「レジスト リ検索」、「Windows インストーラ検索」を追加することができます。 まずは「ファイル検索」について説明します。 「ファイル検索」では、指定された条件のファイルを検索し、見つか れば指定されたPropertyにファイルのパスをセットします。この Propertyを「起動条件」に指定すれば、ファイルが見つかった時、あ るいは見つからなかった時のみにインストーラを実行することが出来 るようになります。なお、「ファイル検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、DrLocator、 Signatureテーブルです。 [URL]AppSearch Table http://msdn.microsoft.com/library/en-us/msi/setup/appsearch_table.asp [URL]DrLocator Table http://msdn.microsoft.com/library/en-us/msi/setup/drlocator_table.asp [URL]Signature Table http://msdn.microsoft.com/library/en-us/msi/setup/signature_table.asp このファイル検索(「対象コンピュータ上の検索」すべて)は、イン ストーラの開始時、「起動条件」の判断前に行われます(正確には、 InstallUISequence table、InstallExecuteSequenceテーブルの AppSearchアクションを実行している位置です)。 [URL]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」を参考にしてください。 [URL]System Folder Properties http://msdn.microsoft.com/library/en-us/msi/setup/system_folder_properties.asp 次にこのファイルが見つかった時のみインストーラが実行できるよう に、起動条件を追加します。まず先に説明したように「起動条件」を 追加し、Conditionに「FILEEXISTS1」と入力し、Messageに適当なメ ッセージを入力します。 以上で「Msjet40.dll」がシステムフォルダにあるときのみインストー ラが実行されるようになります。 ファイルの検索をさらに更新日、サイズ、バージョンで絞り込むこと もできます。それには、以下のプロパティを使用しなければなりませ ん。 MinDate 検索するファイルの最も古い更新日時の日付を指定します。つまり、 ここで指定した日付と同じか、より新しい更新日時のファイルを検索 します。「2005/06/01」のように指定します。 MaxDate 検索するファイルの最も新しい更新日時の日付を指定します。つま り、ここで指定した日付と同じか、より古い更新日時のファイルを検 索します。 MinSize 検索するファイルの最小サイズをバイト単位で指定します。つまり、 ここで指定したサイズと同じか、より大きいサイズのファイルを検索 します。 MaxSize 検索するファイルの最大サイズをバイト単位で指定します。つまり、 ここで指定したサイズと同じか、より小さいサイズのファイルを検索 します。 MinVersion 検索するファイルの最小のバージョンを指定します。つまり、ここ で指定したバージョンより大きいバージョンのファイルを検索します。 「4.0.8015.0」のように指定します。 MaxVersion 検索するファイルの最大のバージョンを指定します。つまり、ここ で指定したバージョンと同じか、より小さいバージョンのファイルを 検索します。 ★レジストリ検索 「レジストリ検索」では、指定されたレジストリ値を検索し、見つか れば指定されたプロパティにその値のデータをセットします。なお、 「レジストリ検索」で変更されるWindows Installerデータベーステー ブルは、AppSearch、RegLocatorテーブルです。 [URL]RegLocator Table http://msdn.microsoft.com/library/en-us/msi/setup/reglocator_table.asp レジストリ検索プロパティでは、Rootに検索するレジストリルート、 RegKeyに検索するレジストリキー、Valueに検索するレジストリ値、 Propertyに見つかったレジストリ値のデータをセットするPropertyを 指定します。 レジストリ検索を使用した例としては、MSDNの「Microsoft Data Access Components の起動条件の追加」が参考になります。 [URL]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インストーラ検索 「Windowsインストーラ検索」では、指定されたComponentがコンピュー タにインストールされているか調べ、見つかれば指定されたプロパテ ィにComponentがインストールされているフォルダのパスをセットし ます。なお、「Windowsインストーラ検索」で変更されるWindows Installerデータベーステーブルは、AppSearch、CompLocatorテーブ ルです。 [URL]CompLocator Table http://msdn.microsoft.com/library/en-us/msi/setup/complocator_table.asp Componentとは、Windows Installerがインストール(あるいはアンイ ンストール)する項目の最小の塊とでも言えるでしょうか。詳しい説 明は、MSDNをご覧ください。 [URL]Component http://msdn.microsoft.com/library/en-us/vsinstal/html/idh_vedefvisualstudioinstallercomponent.asp [URL]Installer Components, Files, and Folders http://msdn.microsoft.com/library/en-us/vsinstal/html/veconinstallercomponentsfilesfolders.asp 「Windowsインストーラ検索」では、検索するComponentのIDを「 ComponentID」に指定する必要がありますが、MSDNに書いてあるよう に、このIDを知る術がVS.NETにはありません。 [URL]Windows インストーラ起動条件の追加 http://www.microsoft.com/japan/msdn/library/ja/vsintro7/html/vxtskAddingWindowsInstallerLaunchCondition.asp どうやら、ComponentIDを知るには、Orcaのようなツールを使うしか ないようです。OrcaはWindows Installerデータベースの編集を行う ためのツールで、Windows Installer SDKに含まれています。 [URL]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のコードがあります。 [URL]Simple Talk ≫ Blog Archive ≫ Getting started with setup projects http://www.simple-talk.com/2005/04/25/getting-started-with-setup-projects/ ★インターネットインフォメーションサービス起動条件 「対象コンピュータ上の必要条件」ノードを右クリックすることによ り表示されるメニューから、「インターネットインフォメーションサー ビス起動条件の追加」を選択することにより、コンピュータにインター ネットインフォメーションサービス(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を使用していると自動的に追加され、削除で きなくなります。 「.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以上サイズが大きくなります。 =============================== ■ここで示したコードの多くはまずC#で書き、それを「C# to VB.NET Translator」でVB.NETのコードに変換し、修正を加えたものです。 [URL]C# to VB.NET Translator http://authors.aspalliance.com/aldotnet/examples/translate.aspx ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2004-Oct 2005)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2005 DOBON! All rights reserved. ===============================