В наборе инструментов Windows Install XML, для установки сервиса мы группируемся <ServiceInstall>
с a <File>
в a <Component>
. Для условной установки сервиса мы помещаем <Condition>
под <Component>
. Однако, если условие будет ложью, то файл не будет установлен также. Если я поместил <File>
в безусловном <Component>
, затем сервис не имеет никакого пути исполняемого файла, и таким образом установка перестанет работать. Если я поместил <File>
в обоих <Component>
, дублирующиеся символы будут найдены.
Вопрос, мы можем установить сервис условно, но установить связанный исполняемый файл безусловно?
Спасибо!
Создайте два компонента с разными идентификаторами GUID и идентификаторами и взаимоисключающими условиями: один для файла и службы, а другой - только для файла. Примерно так:
<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes">
<Condition> SOME_CONDITION </Condition>
<File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
<ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" />
<ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" />
</Component>
<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" >
<Condition> NOT SOME_CONDITION </Condition>
<File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" />
</Component>
Вы получите предупреждение LGHT1076, которое может быть подавлено, поскольку условия в компонентах являются взаимоисключающими.
Я шел по этому пути, и он усложняется быстрее, чем можно было бы ожидать.
Я считаю, что наличие двух компонентов (несмотря на их взаимоисключающие условные выражения) с одним и тем же ключевым файлом, но разными ресурсами ServiceInstall / Control, является нарушением правила компонента.
Я предлагаю переместить всю бизнес-логику в отдельный компонент DLL и создать два разных компонента EXE. Настройте один как приложение консоли / Windows, а другой как приложение службы. Свяжите компоненты с двумя разными функциями, чтобы конечный пользователь мог решить, каким образом он хочет настроить приложение. Затем пользователь может выполнить операцию изменения в добавлении / удалении программ и использовать MSI, чтобы изменить свое мнение позже.