2009-08-12 9 views
5

いくつかの追加ファイルを含むサービスをWiXにインストールする方法と、実際のサービスEXEファイルを定義する方法はありますか?WiX(2.0)を使用したマルチファイルNTサービスのインストール

シナリオ:私はちょうど単一EXEファイルだったサービスがあったが、このコードでのWiXでのWindows NTサービスとしてインストール:

<Component Id='InstallMyServiceComponent' Guid='{....}' DiskId='1'> 
    <File Id='InstallMyServiceEXEFile' LongName='MyService.exe' 
     Name='MyServ.exe' src='MyService/bin/release/MyService.exe' KeyPath='yes'/> 
    <ServiceInstall Id='InstallMyService' Name='MyService' Description='My Service' 
     ErrorControl='normal' Start='auto' Type='ownProcess' Vital='yes' /> 
    <ServiceControl Id='UninstallMyService' Name='MyService' Remove='uninstall' 
     Wait='yes' /> 
</Component> 
<Component Id='RunMyServiceComponent' Guid='.......'> 
    <ServiceControl Id='RunMyService' Name='MyService' Start='install' 
     Stop='uninstall' Wait='no' /> 
</Component> 

と私はその後、インストールできるようになる機能を持っていました必要に応じてこのサービスを開始します。

私の問題は、今や私のサービスが成長し、単一のEXEはもはや単一のEXEではなく、複数のファイル、EXE、DLL、いくつかのサポートファイルです。

しかし、どうすれば今すぐインストールできますか?

私はすべての私のファイル

<Component Id="MyService" Guid="......" DiskId="1"> 
    <File Id="fileMyService_framework_dll" LongName="Framework.dll" 
     Name="Framewrk.DLL" src="MyService\Framework.dll" /> 
    <File Id="fileMyService_dal_dll" LongName="MyServiceDAL.dll" 
     Name="SrvcDAL.DLL" src="MyService\ServiceDAL.dll" /> 
    <File Id="fileMyService_helpers_dll" LongName="Helpers.dll" 
     Name="Helpers.DLL" src="MyService\Helpers.dll" /> 
    <File Id="fileMyService_exe" LongName="MyService.exe" 
     Name="MySrv.EXE" src="MyService\MyService.exe" /> 
</Component> 

まず持つコンポーネントを持つようにしようとした、私はちょうどこのコンポーネントにServiceInstallとに、Servicecontrolタグを追加しようとしました:

<Component Id="MyService" Guid="......" DiskId="1"> 
    <File Id="fileMyService_framework_dll" LongName="Framework.dll" 
     Name="Framewrk.DLL" src="MyService\Framework.dll" /> 
    <File Id="fileMyService_dal_dll" LongName="MyServiceDAL.dll" 
     Name="SrvcDAL.DLL" src="MyService\ServiceDAL.dll" /> 
    <File Id="fileMyService_helpers_dll" LongName="Helpers.dll" 
     Name="Helpers.DLL" src="MyService\Helpers.dll" /> 
    <File Id="fileMyService_exe" LongName="MyService.exe" 
     Name="MySrv.EXE" src="MyService\MyService.exe" /> 
    <ServiceInstall Id='InstallMyService' Name='MyService' 
     Description='My Service' ErrorControl='normal' Start='auto' 
     Type='ownProcess' Vital='yes' /> 
    <ServiceControl Id='UninstallMyService' Name='MyService' 
     Remove='uninstall' Wait='yes' /> 
</Component> 

しかし、その後、私の「フレームワーク。 dll "が作成されるサービスのソースパスとして設定される.......

実際にサービスをインストールするには、ServiceInstall私はFileRefを使ってそのサービスEXEファイルを参照していますが、それは存在しないようです(少なくともWix2では)。

<Component Id='InstallMyServiceComponent' Guid='{....}' DiskId='1'> 
    <FileRef Id='fileMyService_exe' KeyPath='yes'/> 
    <ServiceInstall Id='InstallMyService' Name='MyService' 
     Description='My Service' ErrorControl='normal' Start='auto' 
     Type='ownProcess' Vital='yes' /> 
    <ServiceControl Id='UninstallMyService' Name='MyService' 
     Remove='uninstall' Wait='yes' /> 
</Component> 

そう - 何が悪いのWiX著者奨めは、すべての必要なファイルをインストールするために行う、まだファイルのコンポーネントのリストから正しいEXEファイル(だけでなく、任意のファイルをピックアップするNTサービスのインストールを取得しています)??

マルク・

+1

File要素のexeにKeyPath = 'yes'を設定するのを忘れました。 –

+0

ありがとう、シェイロブの答えはあなたの声明を確認するようです - 大いに感謝! –

答えて

7

ServiceInstall要素はServiceInstallがであるコンポーネントの「キーパス」を指していることになります。デフォルトでのWiXツールセットがキーパスとしてあなたのコンポーネントの最初のファイルまたはのRegistryKey要素をピックアップ。コンポーネントにファイルを追加すると、リストの先頭にある.dllがKeyPathになりました。

一般に、小さいコンポーネントは大きいコンポーネントよりも優れています。したがって、より良い解決策は、別のコンポーネントにDLLを配置することです。その後、.exeファイル要素とServiceInstall要素を同じComponentに残すことができます。それはすべて非常にきれいになります。

「サービス」をまとめてグループ化する場合は、ComponentGroup要素を作成し、ComponentRefsを.exeおよび.dllコンポーネントに配置できます。これでFeature/ComponentGroupRefから参照できる1つのことができました。

+0

+1素晴らしい説明 - ありがとう、ロブ!私はそれに応じて私のWiXスクリプトを変更し、明日夜のビルドが実行され、インストールがテストされている:-) –

+0

はい、確認 - "KeyPath = 'はい'を追加する - 私の問題を解決しました - ちょうど良い - ありがとう、ロブ! –