Wix: как принудительно убить процесс/задачу?

Мне нужно принудительно завершить процесс, работающий в фоновом режиме, прежде чем пытаться удалить какие-либо файлы при запуске удаления из 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 по-прежнему отображается в диспетчере задач после завершения удаления. Кроме того, было выдано следующее сообщение об ошибке:

Сообщение об ошибке №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(); или Окружающая среда.Выход(0); в какой-то строке внутри Program.cs.

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


person safejrz    schedule 14.05.2013    source источник


Ответы (1)


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

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

person caveman_dick    schedule 14.05.2013
comment
Ну вот и решилась вторая проблема :) Спасибо! Теперь мне нужно выяснить, ПОЧЕМУ ни один из них не убивает задачу и не оставляет ее в живых (я все еще вижу Foo.exe в taskmgr и первое сообщение об ошибке). - person safejrz; 14.05.2013
comment
Какой пользователь запускает приложение, то же самое, с которым вы устанавливаете? В противном случае его нужно будет запустить как отложенное действие, чтобы системная учетная запись убила процесс. - person caveman_dick; 14.05.2013