回答編集履歴
2
追記の修正
test
CHANGED
@@ -9,10 +9,10 @@
|
|
9
9
|
回避するには
|
10
10
|
|
11
11
|
・子プロセスの起動後にTcpListenerを起動(ご記載の通り。ハンドルを継承させない)
|
12
|
-
・
|
12
|
+
・ProcessStartInfoのプロパティ`UseShellExecute = true`に設定
|
13
13
|
|
14
14
|
とすると発生しないようです。
|
15
15
|
|
16
|
-
追記:
|
16
|
+
追記:.NET 2.0の頃もこの挙動(仕様)のようです。
|
17
17
|
https://bytes.com/topic/c-sharp/answers/275592-tcplistener-inherited-child-processes-when-useshellexecute-false
|
18
18
|
|
1
追記を記載
test
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
確かに.NET Framework4.8ではこの現象が発生しますね。(.NET 7では発生しない)
|
2
2
|
|
3
|
-
.NET Framework
|
3
|
+
.NET Frameworkでは、子プロセス起動時に呼ばれるWin32関数 CreateProcess()の引数が`bInheritHandles=true`になっているようです。
|
4
4
|
|
5
5
|
https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,2120
|
6
6
|
|
7
|
-
そうすると親プロセスのハンドルを継承するのでこのような現象が発生するのだと思います。
|
7
|
+
そうすると子プロセスが親プロセスのハンドルを継承するのでこのような現象が発生するのだと思います。
|
8
8
|
|
9
9
|
回避するには
|
10
10
|
|
11
11
|
・子プロセスの起動後にTcpListenerを起動(ご記載の通り。ハンドルを継承させない)
|
12
|
-
・子プロセス
|
12
|
+
・子プロセス生成オプション`UseShellExecute = true`に設定
|
13
13
|
|
14
14
|
とすると発生しないようです。
|
15
15
|
|
16
|
+
追記:少なくとも.net Framework 2.0時代からの挙動(仕様)のようです。
|
17
|
+
https://bytes.com/topic/c-sharp/answers/275592-tcplistener-inherited-child-processes-when-useshellexecute-false
|
18
|
+
|