Мне нужно принудительно завершить процесс, работающий в фоновом режиме, прежде чем пытаться удалить какие-либо файлы при запуске удаления из MSI, созданного с помощью Wix. Основное приложение состоит из значка в трее, который отражает статус bg-процесса, отслеживающего локальные службы Windows (сделанный на C#, хотя это может быть не так актуально в дальнейшем).
Сначала я попробовал следующее:
<File Id='FooEXE' Name='Foo.exe' Source='..\Source\bin\Release\Foo.exe' Vital='yes' />
...
<InstallExecuteSequence>
<Custom Action="CloseTray" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="CloseTray" ExeCommand="-exit" FileKey="FooEXE" Execute="immediate" Return="asyncWait" />
Значок в трее немедленно закрывается после подтверждения диалога закрытия приложения, но задача Foo.Exe по-прежнему отображается в диспетчере задач после завершения удаления. Кроме того, было выдано следующее сообщение об ошибке:
Вот почему тогда я попробовал это:
<InstallExecuteSequence>
<Custom Action="Foo.TaskKill" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="Foo.TaskKill" Impersonate="yes" Return="asyncWait" Directory="WinDir" ExeCommand="\System32\taskkill.exe /F /IM Foo.exe /T" />
Получив тот же результат, попробовал:
<Property Id="QtExecCmdLine" Value='"[WinDir]\System32\taskkill.exe" /F /IM Foo.exe'/>
...
<InstallExecuteSequence>
<Custom Action="MyProcess.TaskKill" Before="InstallValidate" />
</InstallExecuteSequence>
...
<CustomAction Id="MyProcess.TaskKill" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore"/>
Пример, который я взял отсюда: Как убить процесс из WiX
в последнее время, когда все остальное не удалось, я также безуспешно пробовал это:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
...
<InstallExecuteSequence>
<Custom Action="WixCloseApplications" Before="InstallValidate" />
</InstallExecuteSequence>
...
<util:CloseApplication Id="CloseFoo" CloseMessage="yes" Description="Foo is still running!" ElevatedCloseMessage="yes" RebootPrompt="yes" Target="Foo.exe" />
Это дало мне другую ошибку:
Я думаю построить статую в честь этого процесса, который просто отказывается умирать!!! ... либо так, либо думаю, что существует проблема на стороне приложения, где я должен добавить что-то вроде Application.Exit(); или Окружающая среда.Выход(0); в какой-то строке внутри Program.cs.
Есть ли что-то еще, что я могу сделать в Wix или в своем приложении, чтобы попытаться успешно закрыть его при удалении? Спасибо!