应用程序中的卸载程序通常会启动新进程,我正在尝试让我的应用程序知道它,因此如果在卸载后,它将执行某些任务。
NSIS例如。
string uninstallstring = "C:\\Program Files (x86)\\Pidgin\uninstall.exe"; // reg.GetValue("UninstallString").ToString();
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = uninstallstring
},
EnableRaisingEvents = true
};
p.Start();
p.WaitForExit();
Debug.WriteLine(p.HasExited);
Debug.WriteLine(p.ExitCode);
// clean up TASKS after uninstall here
// clean clean clean
上面的代码将尝试卸载Pidgin。它将是Start(),它应该等待卸载程序完成其作业并在Debug面板中显示True / False(HasExited)及其ExitCode。
问题是,执行Start()后,“uninstall.exe”在“C:\ Users \ Jayson \ AppData \ Local \ Temp \ ~nsu.tmp”中启动了一个新的应用程序“Au_.exe”并且“uninstall.exe”关闭,WaitForExit()完成了它的工作,Debug面板显示
True
0
那些是“HasExited”和“ExitCode”,但是Pidgin Uninstall仍然在运行,它告诉我“uninstall.exe”启动了“Au_.exe”而不是他的子进程。
我的问题是,如何确保卸载程序完成其工作?
答案 0 :(得分:2)
如果您知道应用程序的名称,由unnistaller启动,您可以尝试通过计时器检查其procces的存在使用Process.GetProcessesByName("Au_.exe")
。当程序出现然后消失时,你可以提出回调。
您也可以阅读GetExitCodeProcess
答案 1 :(得分:0)
我认为这里没有一般解决方案。您依赖于无法按预期工作的外部组件(通常我们希望uninstall.exe仅在完全卸载后退出并返回相应的错误代码,但它不会返回。)
有几种解决方法:
当uninstall.exe完成后,查找Au_.exe进程并等待其完成。
在uninstall.exe之后(可能是Au_.exe)检查它是否真的卸载了Pidgin。您可以检查文件系统或一些特殊的注册表项。在您的自定义清理任务之前,您可能期望一些东西。如果没有正确卸载 - 重复或不清理(可能会显示一些错误或写入日志消息 - 这取决于您的应用程序)。
为Pidgin制作自定义卸载程序,以清理所有必要的资源。 Pidgin是开源的,因此您可以查看其安装程序的工作原理。可能只需修改现有的安装程序即可。
不要担心Au_.exe而只是清理你的资源 - 可能对你的应用程序来说真的不是问题。
(如果可能)请求您的应用程序用户卸载Pidgin。当用户这样做时 - 进行一些简单的检查(例如删除C:/ Program Files / Pidgin)并进行清理。