web-dev-qa-db-ja.com

生成プロセスの子ではなく、新しいプロセスを開始します

呼び出しプロセスの子ではなく、新しいプロセスを開始するにはどうすればよいでしょうか。

例:

メインプログラム(Caller.exe)

process.start("file.exe")

画像:

enter image description here

26
Andrew Paglusch

これが私が現在使用しているコードです。誰かの役に立つと思いました。 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
1
Andrew Paglusch

生成されたプロセス(子)が終了する前に、生成されたプロセス(親)が終了すると、親子チェーンが切断されます。これを利用するには、次のような中間スタブプロセスを使用する必要があります。

Caller.exe→Stub.exe→File.exe。

ここでStub.exeは、File.exeを起動した直後に終了する単純なランチャープログラムです。

20
Josh

プロセスを開始すると、その親になります。

代わりに、代わりにcmd.exeからプロセスを開始しようとすると、cmd.exeが親になります。

Process proc = Process.Start(new ProcessStartInfo { Arguments = "/C Explorer", FileName = "cmd", WindowStyle = ProcessWindowStyle.Hidden });
9
ken2k

これは親なしで新しいプロセスを実行します:

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);
4
Pawel P

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はあなたが望むことをすべきです。

1
JBSnorro