これが私が現在使用しているコードです。誰かの役に立つと思いました。 1つの引数を受け入れます。引数は、実行するファイルのパスにデコードするbase64エンコードされた文字列です。
Module Module1
Sub Main()
Dim CommandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Application.CommandLineArgs
If CommandLineArgs.Count = 1 Then
Try
Dim path As String = FromBase64(CommandLineArgs(0))
Diagnostics.Process.Start(path)
Catch
End Try
End
End If
End Sub
Function FromBase64(ByVal base64 As String) As String
Dim b As Byte() = Convert.FromBase64String(base64)
Return System.Text.Encoding.UTF8.GetString(b)
End Function
End Module
生成されたプロセス(子)が終了する前に、生成されたプロセス(親)が終了すると、親子チェーンが切断されます。これを利用するには、次のような中間スタブプロセスを使用する必要があります。
Caller.exe→Stub.exe→File.exe。
ここでStub.exeは、File.exeを起動した直後に終了する単純なランチャープログラムです。
プロセスを開始すると、その親になります。
代わりに、代わりにcmd.exeからプロセスを開始しようとすると、cmd.exeが親になります。
Process proc = Process.Start(new ProcessStartInfo { Arguments = "/C Explorer", FileName = "cmd", WindowStyle = ProcessWindowStyle.Hidden });
これは親なしで新しいプロセスを実行します:
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = @"cmd";
psi.Arguments = "/C start notepad.exe";
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
System.Diagnostics.Process.Start(psi);
Process.Start(string fileName)
のドキュメントには、
a new process that’s started alongside already running instances
of the same process will be independent
そしてそれは言う
Starting a process by specifying its file name is similar to
typing the information in the Run dialog box of the Windows Start menu
私にとっては、独立したプロセスと一致しているようです。
したがって、ドキュメントによると、Process.Start
はあなたが望むことをすべきです。