回答編集履歴

2

追記の修正

2023/08/30 05:39

投稿

hqf00342
hqf00342

スコア394

test CHANGED
@@ -9,10 +9,10 @@
9
9
  回避するには
10
10
 
11
11
  ・子プロセスの起動後にTcpListenerを起動(ご記載の通り。ハンドルを継承させない)
12
- プロセス生成オプション`UseShellExecute = true`に設定
12
+ ProcessStartInfoのプロパティ`UseShellExecute = true`に設定
13
13
 
14
14
  とすると発生しないようです。
15
15
 
16
- 追記:少なくとも.net Framework 2.0時代からの挙動(仕様)のようです。
16
+ 追記:.NET 2.0の頃もこの挙動(仕様)のようです。
17
17
  https://bytes.com/topic/c-sharp/answers/275592-tcplistener-inherited-child-processes-when-useshellexecute-false
18
18
 

1

追記を記載

2023/08/29 15:03

投稿

hqf00342
hqf00342

スコア394

test CHANGED
@@ -1,15 +1,18 @@
1
1
  確かに.NET Framework4.8ではこの現象が発生しますね。(.NET 7では発生しない)
2
2
 
3
- .NET Frameworkの場合、子プロセス起動時に呼び出されるWin32関数 CreateProcess()の引数`bInheritHandles=true`になっているようです。
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
- ・子プロセスの起動を`UseShellExecute = true`に設定
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
+