1

应用程序的卸载程序通常会启动新进程,我试图让我的应用程序知道它,所以如果在卸载后,它将执行一些任务。

以 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() 并等待卸载程序完成其工作并在调试面板中显示 True/False (HasExited) 及其 ExitCode。

问题是,在 Start() 执行后,“uninstall.exe”在“C:\Users\Jayson\AppData\Local\Temp\~nsu.tmp”和“uninstall”中启动了一个新的应用程序“Au_.exe” .exe" 关闭,WaitForExit() 已完成工作,调试面板显示

True
0

这些是“HasExited”和“ExitCode”,但 Pidgin Uninstall 仍在运行,这告诉我“uninstall.exe”启动了“Au_.exe”而不是他的子进程。

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

4

2 回答 2

2

如果您知道应用程序的名称,由 unistaller 启动,您可以尝试检查Process.GetProcessesByName("Au_.exe")计时器使用的进程是否存在。当进程出现然后消失时,您可以提出回调。您还可以阅读有关GetExitCodeProcess的信息

于 2013-06-10T03:51:01.830 回答
0

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

有几种解决方法:

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

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

  3. 为 Pidgin 制作了您的自定义卸载程序,它将清理所有必要的资源。Pidgin 是开源的,所以你可以看看它的安装程序是如何工作的。可能只需修改现有的安装程序就足够了。

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

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

于 2013-06-10T04:34:29.733 回答