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" で新しいアプリケーション "Au_.exe" を起動し、"uninstall .exe" が閉じられ、WaitForExit() がジョブを完了し、デバッグ パネルが表示されます

True
0

それらは「HasExited」と「ExitCode」ですが、Pidgin Uninstallはまだ実行中であり、「uninstall.exe」が「Au_.exe」を子プロセスではなく起動したことがわかります。

私の質問は、アンインストーラーがその仕事を確実に終了するにはどうすればよいですか?

4

2 に答える 2

2

unnistaller が起動したアプリケーションの名前がわかっている場合は、unnistaller が使用Process.GetProcessesByName("Au_.exe")するプロセスの存在をタイマーで確認できます。収益が現れて消えたときに、コールバックを発生させることができます。GetExitCodeProcessについても読むことができます

于 2013-06-10T03:51:01.830 に答える
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 が削除された) を行い、クリーンアップを行います。

于 2013-06-10T04:34:29.733 に答える