检测应用程序是否已启动另一个进程

时间:2013-06-10 03:13:04

标签: c# process

应用程序中的卸载程序通常会启动新进程,我正在尝试让我的应用程序知道它,因此如果在卸载后,它将执行某些任务。

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”而不是他的子进程。

我的问题是,如何确保卸载程序完成其工作?

2 个答案:

答案 0 :(得分:2)

如果您知道应用程序的名称,由unnistaller启动,您可以尝试通过计时器检查其procces的存在使用Process.GetProcessesByName("Au_.exe")。当程序出现然后消失时,你可以提出回调。 您也可以阅读GetExitCodeProcess

答案 1 :(得分:0)

我认为这里没有一般解决方案。您依赖于无法按预期工作的外部组件(通常我们希望uninstall.exe仅在完全卸载后退出并返回相应的错误代码,但它不会返回。)

有几种解决方法:

  1. 当uninstall.exe完成后,查找Au_.exe进程并等待其完成。

  2. 在uninstall.exe之后(可能是Au_.exe)检查它是否真的卸载了Pidgin。您可以检查文件系统或一些特殊的注册表项。在您的自定义清理任务之前,您可能期望一些东西。如果没有正确卸载 - 重复或不清理(可能会显示一些错误或写入日志消息 - 这取决于您的应用程序)。

  3. 为Pidgin制作自定义卸载程序,以清理所有必要的资源。 Pidgin是开源的,因此您可以查看其安装程序的工作原理。可能只需修改现有的安装程序即可。

  4. 不要担心Au_.exe而只是清理你的资源 - 可能对你的应用程序来说真的不是问题。

  5. (如果可能)请求您的应用程序用户卸载Pidgin。当用户这样做时 - 进行一些简单的检查(例如删除C:/ Program Files / Pidgin)并进行清理。