2

ローカルホストのポート8881へのソケット接続を開く簡単にするために、「アプリケーションA」を呼び出すプログラムを作成しています。後で、コードブローを使用してexeアプリケーション呼び出し「APPLICATIONB」を生成します。

        try
        {
            XmSam.Log("Spawning (" + process + ")");

            ProcessEx proc = new ProcessEx();

            proc.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + process + ".exe";
            proc.StartInfo.Arguments = parameters;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();

            Program.Processes.Add(proc);

            XmSam.Log("Spawned " + proc.ProcessName);
        }
        catch (Exception ex)
        {
            XmSam.Log(ex);
        }

アプリケーションAをオフにしても(アプリケーションを停止するか、ウィンドウタスクマネージャーでそのプロセスを強制終了することにより)、アプリケーションBは引き続き実行されます。これは問題ありません。ただし、アプリケーションAを再度開始すると、例外が発生しました。

2012-10-18 16:21:23 - Only one usage of each socket address (protocol/network address/port) is normally permitted
2012-10-18 16:21:23 -    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)

このエラーは、アプリケーションAがポート8881へのソケットを開こうとしたときに発生しました。このエラーは、アプリケーションBを強制終了すると消えます。以下のコードが示すようなものがないため、アプリケーションBのコードが原因ではないと思います。

    [STAThread]
    static void Main()
    {
        while (true)
        {
        }
    }

ProcessクラスでMSDNを調べようとしましたが、これについては何もわかりませんでした。プロセスを生成したとき、そのプロセスは呼び出しアプリケーションから独立していると思いましたが、そうではないようです。呼び出しアプリケーションを保持せずにプロセスを生成できる設定を知っていますか?

別の方法は、アプリケーションAにコードを入れてアプリケーションBを強制終了することですが、特にアプリケーションAが予期せずクラッシュした場合、それはアイデアの解決策ではありません。

ありがとうございました。

4

2 に答える 2

2

さらに掘り下げた後、答えを見つけました。この素晴らしい記事を見つけました

その中で、この問題の主な説明は次のとおりです。

System.Diagnostics.Process.Start により、子プロセスは親プロセスからハンドルを継承します。つまり、生成したプロセス (Internet Explorer など) が何であれ、そのプロセスは、そのプロセスが所有するすべてのハンドルを取得します。したがって、プロセスでハンドルを解放しても、生成したプロセスがまだ実行されている場合、子プロセスが使用していると思われるため、ハンドルは実際には解放されません。

そのことを念頭に置いて、私がしなければならないことは、UseShellExecute フラグを true に更新することだけです。

proc.StartInfo.UseShellExecute = true;
于 2012-10-19T14:40:46.737 に答える
0

アプリケーション A がソケットを閉じるときにソケットを閉じることを確認する必要があります。Application.ApplicationExit Event は、それを行うのに適した場所、またはソケットを使い終わったときに適していると思います。

于 2012-10-19T13:44:43.723 に答える