1

アセンブリがあります。それを呼び出しましょうFoo.exeBar1.exeこの実行可能ファイルは、またはのような別のアプリケーションによって起動されますBar2.exe

実行すると、またはプロセスが実行Foo.exeされているかどうかを10秒ごとにチェックします。そうでない場合は、いくつかのものをクリーンアップしてシャットダウンします。Bar1Bar2

これは通常のユーザーシナリオで機能します。しかし、開発する場合、1つの大きな問題があります。アプリケーションは、アプリケーションがデバッグ中であるBar1かどうかを確認できません。どちらの場合も、タスクマネージャーで使用できます。Bar2Bar.svhost.exe

つまり、Bar.svhost.exeが無視され、Foo.exeデバッグプロセス中に終了する場合、これは不可能です。

しかし、もしBar.svhost.exe見られるなら、Foo.exe決して終わらない、私達は手動で殺さなければならないが、それからそれはきちんと掃除されなかった。

問題を解決する方法はありますか?

(マシン上で複数または実行できるが、1回だけ実行する必要があるため、またはを終了するFoo.exeことはできません。したがって、それ自体をチェックする必要があります。プロセスを「強制終了」すると、クリーンアップされます)Bar1Bar2Bar1Bar2FooFoo.exe

追加:ここに問題の擬似コードの例があります

//Bar1.exe and Bar2.exe
void Main()
{
    if (!FooIsRunning())
        StartFoo();
    DoSomething();
}

//Foo.exe
void Main()
{
    Initialize();
    while (BarIsRunning());
    Cleanup();
}

private bool BarIsRunning()
{
    var processes = Process.GetProcesses();
    if (processes.Any(p => p.ProcessName.Contains("Bar.exe"))
        return true;

    var vshostProcess = processes.FirstOrDefault(p => p.ProcessName.Contains("Bar.vshost.exe");
    return vshostProcess != null && ProcessIsDebugging(process);
}

private bool ProcessIsDebugging(Process process)
{
    // How to...
    return true;
}
4

3 に答える 3

4

Debugger.IsAttachedを確認しましたか?

于 2012-08-07T14:23:44.293 に答える