5.1 .NET の枠組み
.NET Framework に基づいたプログラムを配布しようとする場合、ユーザーがフレームワークをインストール済みであることを確かめなければなりません。Microsoft はフレームワークの再頒布を許可していますが、再頒布の形式は元の Dotnetfx.exe ファイルに限るとしています(Microsoft による解説、Redistributing the .NET Framework を参照して下さい)。
† 訳註:上記記事の日本語版は .NET Framework の再頒布 です。
このことは、フレームワークを自分自身の .msi パッケージに組み込むことは出来ない、ということも意味しています。マージ・モジュールやそれに類するものは手に入りません。独立したブートストラップ・インストーラを提供する必要があります。ブートストラップ・インストーラ(Steup.exe)は、フレームワークがインストールされているかどうかを調べて、再頒布用の Dotnetfx.exe を起動します(あるいは、別の方法としては、ネットからダウンロードしてインストールします)。そして、.NET Framework のインストールが完了した後で、あなた自身のインストーラ・パッケージを呼び出すようにするのです。
しかし、そのようなブートストラップ・インストーラを自分で書く必要はありません。次のバージョンの WiX、バージョン 3.5 には Burn と呼ばれる独自のブートストラッパーが付属します。しかし、3.5 がリリースされるまでは、Microsoft によって提供されているものを使うか、あるいは、無料でオープン・ソースのブートストラッパー、dotNetInstaller を使うことが出来ます。または、もう一つの選択肢としては、AutoIt スクリプト言語 を使って自分で書くことも出来ます。
† 訳註:dotNetInstaller に関しては、http://cml.s10.xrea.com/ の「和訳文書」中にユーザーズ・ガイドの日本語訳があります。
ユーザーのコンピュータに .NET Framework が存在するかどうかを調べる必要があるときは、WiX に付属している WixNetFx 拡張モジュールを使うことが出来ます。この拡張モジュールは、フレームワークのすべてのバージョンについて、数多くのプロパティを設定します(完全なリストは WiX のヘルプ・ファイルにあります)。その中で、最も重要なものは以下のものでしょう。
- NETFRAMEWORKxx
- 指定されたバージョンのフレームワークがインストールされている場合にセットされる。
- NETFRAMEWORKxx_SP_LEVEL
- フレームワークのサービス・パックのレベルがセットされる。
- NETFRAMEWORKxxINSTALLROOTDIR
- フレームワークのインストール・フォルダがセットされる。
これらすべてのプロパティの値は、PropertyRef タグを使ってプロパティを参照するだけで簡単に読むことが出来ます。
<PropertyRef Id="NETFRAMEWORK10"/> <Condition Message='このセットアップを実行するためには、.NET Framework 1.0 がインストールされている必要があります。'> <![CDATA[Installed OR NETFRAMEWORK10]]> </Condition>
サービス・パックを確認する必要がある場合、フレームワークのバージョンそのものは確認する必要がありません。SP プロパティは、ベースのフレームワークが存在している場合にしか、セットされないからです。しかし、まず最初にそもそもプロパティが設定されているかどうかをチェックして、それから、実際にどういう値がセットされているかのチェックに進む必要があります。
<PropertyRef Id="NETFRAMEWORK20_SP_LEVEL"/> <Condition Message='このセットアップを実行するためには、.NET Framework 2.0 と Service Pack 1 がインストールされている必要があります。'> <![CDATA[Installed OR (NETFRAMEWORK20_SP_LEVEL AND NETFRAMEWORK20_SP_LEVEL = "#1")]]> </Condition>
最近のフレームワークのバージョンでは、利用可能なプロパティが追加されています。
<PropertyRef Id="NETFRAMEWORK35_CLIENT"/> <Condition Message='このセットアップを実行するためには、.NET Framework 3.5 Client Profile がインストールされている必要があります。'> <![CDATA[Installed OR NETFRAMEWORK35_CLIENT]]> </Condition>
インストーラをリンクするときには、WixNetFxExtension モジュールをリンクするのを忘れないようにして下さい。
candle.exe SampleDotNET.wxs light.exe -ext WixNetFxExtension SampleDotNET.wixobj
完全な SampleDotNET をダウンロードすることが出来ます。
† 訳註:SampleDotNET の日本語版は Sample-5-1-DotNET.zip です。
5.2 インターネットを起動する
ローカルまたはオンラインで、何かをブラウザで起動したい場合があるでしょう。そうするために、ユーザーのディスク上に URL のリンクを作成することが出来ます。URL のリンクは実際には .ini ファイルの形式を取りますので、IniFile を使ってリンクを作成します。
<Component> ... <IniFile Id='Launch' Action='addLine' Name='Launch.url' Directory='INSTALLDIR' Section='InternetShortcut' Key='URL' Value='http://www.acmefoobar.com' /> ... </Component>
既定のブラウザを直接起動するためには、最初に既定のブラウザのパスを調べて、インストールの完了後に、そのパスを使って、通常の方法でカスタム・アクションとして起動します(ただし、インストールの時だけです。アンインストールの時はブラウザを起動しません)。ユーザーが既定のブラウザとして選んでいるブラウザが必ず起動されるように、必ずこの方法を使ってください。決して特定のブラウザをハード・コーディングしないで下さい。
<Property Id="BROWSER"> <RegistrySearch Id='DefaultBrowser' Type='raw' Root='HKCR' Key='http\shell\open\command' /> </Property> <CustomAction Id='LaunchBrowser' Property='BROWSER' ExeCommand='www.piyosoftware.co.jp' Return='asyncNoWait' /> <InstallExecuteSequence> ... <Custom Action='LaunchBrowser' After='InstallFinalize'>NOT Installed</Custom> </InstallExecuteSequence>
完全な SampleBrowser をダウンロードすることが出来ます。
† 訳註:SampleBrowser の日本語版は Sample-5-2-Browser.zip です。
デスクトップやスタート・メニューに、既定のブラウザを起動して特定のウェブ・サイトに飛ぶショートカットを作ることは、さらに簡単に出来ます。注意しなければならないことは、URL にプロパティを使用する、ということだけです。ショートカットの Target 属性に直接に URL を書くと、コンパイラがそれを配置すべきローカル・ファイルの名前だと見なすために、うまく行きません。
<Property Id="URL" Value="http://www.something.com" /> <Shortcut Id="WebShortcut" Name="ぴよソフトのウェブ" Description="ぴよソフトのウェブサイトにジャンプします。" Target="[URL]" />
5.3 ウェブ・ディレクトリ
WiX ツールセットの追加のライブラリの中には、IIS のウェブ・ディレクトリを作成するような付加的な仕事をインストーラが実行出来るようにするものもあります。このような拡張機能は、適切な WiX ライブラリをリンクするだけで使用出来ます。リンカが、必要なヘルパー DLL を自動的にインストーラ・パッケージに含めてくれます。
最初に、ウェブ・サイトと、それに所属するファイルを作らなければなりません。
<Directory Id='TARGETDIR' Name='SourceDir'> <Directory Id='ProgramFilesFolder' Name='PFiles'> <Directory Id='InstallDir' Name='Piyo'> <Component Id='default.phpComponent' Guid='YOURGUID-5314-4689-83CA-9DB5C04D5742'> <File Id='default.htmFile' Name='default.htm' Source='default.htm' DiskId='1' KeyPath='yes' /> </Component> </Directory> </Directory>
次のステップは、仮想ディレクトリの作成です。
<Component Id='TestWebVirtualDirComponent' Guid='YOURGUID-6304-410E-A808-E3585379EADB'> <WebVirtualDir Id='TestWebVirtualDir' Alias='Test' Directory='InstallDir' WebSite='DefaultWebSite'> <WebApplication Id='TestWebApplication' Name='Test' /> </WebVirtualDir> </Component> </Directory>
最後に、ウェブ・サイトを参照する項目を作成します。
<WebSite Id='DefaultWebSite' Description='Default Web Site'> <WebAddress Id='AllUnassigned' Port='80' /> </WebSite>
インストーラ・パッケージをリンクするときは、適切な WiX ライブラリとリンクしなければなりません。リンカに複数の WiX オブジェクト・ファイルを渡しますので、出力ファイルの名前も指定しなければなりません。
light.exe -out SampleWebDir.msi SampleWebDir.wixobj path\sca.wixlib
完全な SampleWebDir をダウンロードすることが出来ます。
† 訳註:上記は WiX 2 の IIS 拡張に基づくものであり、WiX 3 には適用出来ない所があります。また、提供されている SampleWebDir も、そのままでは、WiX 3 でビルド出来ません。
(1) WiX 3 では IIS 拡張が独立の名前空間に移動されたために、Wix 要素で IIS 拡張のスキーマを参照する必要があります(<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:iis='http://schemas.microsoft.com/wix/IIsExtension'>)。同様に、IIS 拡張に属する要素には IIS 拡張の名前空間の修飾が必要です(iis:WebVirtualDir, iis:WebApplication, iis:WebSite および iis:WebAddress)。
(2) WiX 3 では IIS 拡張は sca.wixlib ではなく WixIISExtension.dll で提供されています。コンパイラおよびリンカのコマンド・ラインにおいて、"-ext WixIISExtension" を指定する必要があります。
WiX 3 に対応した日本語版 Sample-5-3-WebDir.zip を参照して下さい。
なお、WixIISExtension の日本語地域化ファイルは(まだ)提供されていませんので、"-cultures:ja-jp" を指定する場合は、日本語地域化ファイルを自分で書く必要があります。
5.4 サービスの提供
サービスをインストールして開始することも自動的に出来ます。
<Component Id='ServiceExeComponent' Guid='YOURGUID-D752-4C4F-942A-657B02AE8325' SharedDllRefCount='no' KeyPath='no' NeverOverwrite='no' Permanent='no' Transitive='no' Win64='no' Location='either'> <File Id='ServiceExeFile' Name='ServiceExe.exe' Source='ServiceExe.exe' ReadOnly='no' Compressed='yes' KeyPath='yes' Vital='yes' Hidden='no' System='no' Checksum='no' PatchAdded='no' /> <ServiceInstall Id='MyServiceInstall' DisplayName='My Test Service' Name='MyServiceExeName' ErrorControl='normal' Start='auto' Type='ownProcess' Vital='yes' /> <ServiceControl Id='MyServiceControl' Name='MyServiceExeName' Start='install' Stop='uninstall' Remove='uninstall' /> </Component>