Pergunta

Como faço para instalar um serviço com alguns arquivos adicionais em WiX, e definir o que é o arquivo EXE serviço real?

Cenário: Eu tinha um serviço que era apenas um único arquivo EXE, e instalou-lo como um serviço do Windows NT em WiX com este código:

<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>

e eu tinha uma característica que permitiria, então, instalar e, opcionalmente, iniciar esse serviço.

Agora, o meu problema é - agora meu serviço tem crescido, eo único EXE não é mais um único EXE. - É vários arquivos, EXE, DLL, e uns arquivos de alguns de apoio

No entanto, como posso instalar que agora ??

Eu tentei ter um componente com todos os meus arquivos

<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>

Em primeiro lugar, eu tentei apenas adicionar as tags ServiceInstall e ServiceControl para este componente:

<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>

mas depois o meu "Framework.dll" é definido como o caminho de origem para o serviço que está sendo criado ........

Então eu pensei em criar um segundo componente para realmente instalar o serviço, usando ServiceInstall, e eu tinha acabado de fazer referência o arquivo EXE serviço usando fileref - mas isso não parece existir (pelo menos em 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>

Assim - que é um pobre autor WiX tem que fazer para instalar todos os arquivos necessários, e ainda obter a instalação do Service NT para pegar o arquivo EXE correto (não apenas qualquer arquivo arbitrário da lista do componente de arquivos) ??

Marc

Foi útil?

Solução

O elemento ServiceInstall vai acabar apontando para a "KeyPath" do Componente do ServiceInstall é. Por padrão o conjunto de ferramentas WiX pega o primeiro arquivo ou elemento RegistryKey em seu componente como o KeyPath. Quando você adicionou arquivos para o componente, o arquivo .dll no topo da lista tornou-se o KeyPath.

Em geral, componentes menores são melhores do que as maiores. Portanto, a melhor solução seria colocar suas DLLs em componentes separados. Então você pode deixar o elemento do arquivo .exe e o elemento ServiceInstall no mesmo componente. Isso torna tudo muito limpo.

Se você, em seguida, quer o "serviço" agrupados, você pode criar um elemento ComponentGroup e colocar ComponentRefs para o .exe e .dll Components. Agora você tem uma única coisa que você pode fazer referência a partir de um Recurso / ComponentGroupRef.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top