Wix: как принудительно убить процесс / задачу?
Мне нужно принудительно убить процесс, который работает в фоновом режиме, прежде чем пытаться удалить какие-либо файлы, при запуске удаления из MSI, созданного с помощью Wix. Основное приложение состоит из traicicon, который отображает состояние локальных служб Windows, отслеживающих процесс bg (созданный на 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 по-прежнему отображается в файле taskmgr после завершения удаления. Также было выдано следующее сообщение об ошибке:
Вот почему, тогда я попробовал это:
<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(); или Environment.Exit(0); в какой-то строке внутри Program.cs.
Есть ли что-то еще, что я мог бы сделать в Wix или в моем приложении, чтобы попытаться успешно закрыть его в Uninstall? Спасибо!
1 ответ
Лично я думаю, что лучший вариант для вас это встроенный CloseApplication
метод, а не ваши предыдущие варианты.
Ошибка, которую вы получаете за это (код ошибки 2762), заключается в том, что вы пытаетесь запланировать действие в немедленной последовательности, но у вас есть ElevatedCloseMessage="yes"
установить, который запускает его как отложенное действие. Удалите этот атрибут или запланируйте его в отложенной последовательности.