Я устанавливаю большое приложение, и часть его представляет собой пользовательский инструмент под названием «DbUpdateManager» для массового выполнения сценариев SQL для нашей целевой базы данных.
В данный момент установка WiX 2.x работает, но у нее есть один недостаток: во время установки я также устанавливаю несколько служб Windows, которые при желании можно запустить сразу же. Однако они не будут выполнены, если DbUpdateManager еще не запущен.
Итак, что я пытаюсь сделать, это:
- Установите DbUpdateManager и мои сервисы из моего MSI
- Запустите DbUpdateManager ДО Запустите любую из служб
Мой текущий источник WiX выглядит примерно так:
<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
<!-- DbUpdateManager component with the necessary files -->
<Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
<File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe'
Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe' KeyPath='no' />
</Component>
<!-- Component to install one of my Windows services -->
<Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
<File Id='InstallServiceFile' LongName='MyService.exe'
Name='MyServic.exe' src='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>
<!-- Feature for the DbUpdateManager referencing the above component -->
<Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR'
AllowAdvertise='no' Description='DbUpdateManager' Level='1'
Title='Database Update Manager'>
<ComponentRef Id='DbUpdateManagerComponent'/>
</Feature>
<!-- Custom action for running DbUpdateManager -->
<CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile'
ExeCommand='' Return='asyncWait' />
<!-- Calling the custom action in the install sequence -->
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallInitialize' />
<Custom Action='RunDbUpdateManagerAction'
After='InstallFinalize'>&DbUpdateManager=3</Custom>
Я унаследовал этот WIX, и он работает - но, как я уже сказал - DbUpdateManager вызывается слишком поздно в процессе (только "After = InstallFinalize"), и, таким образом, сначала службы не будут запускаться должным образом (нормально работает второй раз, когда вы перезапускаете их вручную после запуска DbUpdateManager).
Я немного покопался в документации MSI и нашел хороший шаг под названием «StartServices», так что я догадывался просто изменить свой вызов настраиваемого действия на следующее:
<InstallExecuteSequence>
<Custom Action='RunDbUpdateManagerAction'
Before='StartServices'>&DbUpdateManager=3</Custom>
К сожалению, в этом случае ничего не происходит - DbUpdateManager НИКОГДА не вызывается ....
Есть идеи почему? Отладка MSI / WiX очень сложна, и я больше не вижу леса за деревьями ...
Спасибо!
Марк
РЕДАКТИРОВАТЬ: «RunDbUpdateManagerAction» находится в правильном положении в таблице InstallExecuteSequence в моем MSI - справа ПОСЛЕ InstallServices и просто BEFORE StartServices - и все же это не работает .... DbUpdateManager (утилита Winforms) делает не отображаются во время установки: - (
РЕДАКТИРОВАТЬ 2: теперь мое действие кажется выполненным и в нужное время - к сожалению, я просто не вижу своего мастера :-( То, что я вижу, это код ошибки «возвращаемое значение 1631», что означает что-то вроде «MSI Service не может быть запущен» - wtf ???
MSI (2C: D8) [20: 53: 36: 383]: Выполнение действия: RunDbUpdateManagerAction
Действие 20:53:36: RunDbUpdateManagerAction.
Действие началось в 20:53:36: RunDbUpdateManagerAction.
MSI (2C: D8) [20: 53: 36: 383]: Выполнение действия: StartServices
Действие 20:53:36: StartServices. Услуги запускаются
Действие началось в 20:53:36: StartServices.
Действие завершено в 20:53:36: RunDbUpdateManagerAction. Возвращаемое значение 1631.