A instalação de um multi-arquivo Serviço NT usando WiX (2,0)
-
13-09-2019 - |
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
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.