Начните новый процесс, не будучи потомком процесса нереста - PullRequest
22 голосов
/ 08 декабря 2011

Как мне начать новый процесс, если он не является дочерним процессом вызывающего процесса.

Пример:

Основная программа (Caller.exe)

process.start("file.exe")

Изображение:

enter image description here

Ответы [ 5 ]

20 голосов
/ 08 декабря 2011

Если процесс порождения (родитель) заканчивается раньше, чем порожденный процесс (дочерний процесс), то цепочка родитель-потомок разрывается.Чтобы использовать это, вам нужно использовать промежуточный процесс-заглушку, например, так:

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

Здесь Stub.exe - простая программа запуска, которая завершается сразу после запуска File.exe.

9 голосов
/ 08 декабря 2011

Если вы запустите процесс, то станете его родителем.

Возможно, вы могли бы попытаться запустить ваш процесс из cmd.exe, поэтому cmd.exe будет родительским.

Process proc = Process.Start(new ProcessStartInfo { Arguments = "/C explorer", FileName = "cmd", WindowStyle = ProcessWindowStyle.Hidden });
4 голосов
/ 24 октября 2015

Это запускает новый процесс без родителя:

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);
2 голосов
/ 20 декабря 2017

Документация 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 голос
/ 09 декабря 2011

Вот код, который я сейчас использую.Я думал, что это может быть полезно для кого-то.Он принимает один аргумент.Аргумент представляет собой строку в кодировке 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
...