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 после завершения удаления. Также было выдано следующее сообщение об ошибке:

Сообщение об ошибке № 1

Вот почему, тогда я попробовал это:

<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" />

Этот дал мне другую ошибку:

Ошибка № 2, что я здесь не так делаю

Я думаю о строительстве статуи в честь этого процесса, который просто отказывается умирать!!! ... либо это, либо думаю, что существует проблема на стороне приложения, где я должен добавить что-то вроде Application.Exit(); или Environment.Exit(0); в какой-то строке внутри Program.cs.

Есть ли что-то еще, что я мог бы сделать в Wix или в моем приложении, чтобы попытаться успешно закрыть его в Uninstall? Спасибо!

1 ответ

Лично я думаю, что лучший вариант для вас это встроенный CloseApplication метод, а не ваши предыдущие варианты.

Ошибка, которую вы получаете за это (код ошибки 2762), заключается в том, что вы пытаетесь запланировать действие в немедленной последовательности, но у вас есть ElevatedCloseMessage="yes" установить, который запускает его как отложенное действие. Удалите этот атрибут или запланируйте его в отложенной последовательности.

Другие вопросы по тегам