Элементы ServiceInstall и ServiceControl не приходят после элемента файла, скажем, но они являются дочерними для элемента Component. Они предназначаются для ключевого пути компонента, который является элементом File. Вы можете легко иметь несколько сервисов, определенных в одном компоненте, указывающих на один и тот же исполняемый файл.
<Component Id="c1" Guid="dbc1b8dd-14e1-380f-5793-4a746fa0c5c5">
<File Id="f1" Source="$(var.SourceDir)\TestService.exe" KeyPath="yes" />
<ServiceInstall Id="si1" Name="TestService1" DisplayName="TestService1 Service" Description="TestService1 Service" ErrorControl="normal" Start="auto" Type="ownProcess" />
<ServiceControl Id="sc1" Name="TestService1" Start="install" Stop="both" Remove="both" Wait="yes" />
<ServiceInstall Id="si2" Name="TestService2" DisplayName="TestService2 Service" Description="TestService Service" ErrorControl="normal" Start="auto" Type="ownProcess" />
<ServiceControl Id="sc2" Name="TestService2" Start="install" Stop="both" Remove="both" Wait="yes" />
</Component>
Чтобы каждый сервис вел себя по-разному, вам придется написать код в вашем сервисе для доступа к ServiceBase.ServiceName (это. ServiceName в методе OnStart скорее всего). Отсюда вы можете динамически загружать разные классы из разных сборок.