当从使用Wix创建的MSI运行卸载时,我需要在尝试删除任何文件之前强制终止在后台运行的进程。主要应用程序由一个trayicon组成,它反映了监控本地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" />
确认应用程序关闭对话框后,托盘图标立即关闭,但卸载完成后,仍然会在taskmgr上显示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"/>
我从这里取的样本:How to kill a process from 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或我的应用程序中尝试在卸载时成功关闭它? 谢谢!
答案 0 :(得分:3)
就我个人而言,我认为最好的选择是内置的CloseApplication
方法,而不是之前的选项。
您获得的错误(错误代码2762)是因为您尝试按顺序安排操作,但设置了ElevatedCloseMessage="yes"
,将其作为延迟操作触发。删除此属性或以延迟顺序安排它。