开始新的过程,而不是产卵过程的孩子

时间:2011-12-08 16:37:46

标签: c# vb.net process parent-child

如果不是调用过程的孩子,我将如何开始新的过程。

示例:

主程序(Caller.exe)

process.start("file.exe")

图像:

enter image description here

6 个答案:

答案 0 :(得分:19)

如果产卵过程(父)在产生的过程(子)之前结束,则父子链断开。要使用它,你必须使用如下的中间存根过程:

  

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

这里Stub.exe是一个简单的启动程序,它在启动File.exe之后就结束了。

答案 1 :(得分:9)

如果你开始一个过程,那么你将成为它的父母。

也许您可以尝试从cmd.exe启动进程,因此cmd.exe将成为父进程。

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

答案 2 :(得分:3)

这会在没有父级的情况下运行新进程:

//notice how the i here has changed to 0
for(i=0;i<=n;i++)
{
    for(s=n-i;s>0;s--)
    {
        printf(" ");
    }
    for(j=0;j<=i;j++)
    {
        v=ncr(i,j);
        printf("%d ",v);
    }
    printf("\n");
}

答案 3 :(得分:2)

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应该按照您的意愿行事。

答案 4 :(得分: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

答案 5 :(得分:0)

我一直在尝试启动一个更新程序,该程序删除调用程序的文件并将其替换为新文件。通过设置UseShellExecute = true,我可以避免在调用进程退出时退出生成的进程。

这是在使用WPF的.Net Core 3.0应用程序内部。

var startInfo = new ProcessStartInfo("Updater.exe");
startInfo.UseShellExecute = true;
Process.Start(startInfo);
Environment.Exit(0);