Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在同一控制台中启动进程_C#_Process_Console - Fatal编程技术网

C# 在同一控制台中启动进程

C# 在同一控制台中启动进程,c#,process,console,C#,Process,Console,我可以在与调用程序相同的控制台中启动进程(使用C#process.start())吗?这样就不会创建新窗口,标准输入/输出/错误与调用控制台应用程序相同。我尝试设置process.StartInfo.CreateNoWindow=true但进程仍在新窗口中启动(并在完成后立即关闭)。您可以尝试重定向此进程的输出,然后在调用进程控制台上打印它: public class Program { static void Main() { var psi = new Pro

我可以在与调用程序相同的控制台中启动进程(使用C#
process.start()
)吗?这样就不会创建新窗口,标准输入/输出/错误与调用控制台应用程序相同。我尝试设置
process.StartInfo.CreateNoWindow=true
但进程仍在新窗口中启动(并在完成后立即关闭)。

您可以尝试重定向此进程的输出,然后在调用进程控制台上打印它:

public class Program
{
    static void Main()
    {
        var psi = new ProcessStartInfo
        {
            FileName = @"c:\windows\system32\netstat.exe",
            Arguments = "-n",
            RedirectStandardOutput = true,
            UseShellExecute = false
        };
        var process = Process.Start(psi);
        while (!process.HasExited)
        {
            Thread.Sleep(100);
        }

        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }
}
使用退出的
事件和等待句柄的替代方法:

static void Main()
{
    using (Process p = new Process())
    {
        p.StartInfo = new ProcessStartInfo
        {
            FileName = @"netstat.exe",
            Arguments = "-n",                                        
            RedirectStandardOutput = true,
            UseShellExecute = false                    
        };
        p.EnableRaisingEvents = true;
        using (ManualResetEvent mre = new ManualResetEvent(false))
        {
            p.Exited += (s, e) => mre.Set();
            p.Start();
            mre.WaitOne();
        }

        Console.WriteLine(p.StandardOutput.ReadToEnd());
    }           
}

除了设置
UseShellExecute=false
,您不需要执行任何操作,因为Win32函数的默认行为是控制台应用程序继承其父控制台,除非您指定该标志

我尝试了以下程序:

private static void Main()
{
    Console.WriteLine( "Hello" );

    var p = new Process();
    p.StartInfo = new ProcessStartInfo( @"c:\windows\system32\netstat.exe", "-n" ) 
        {
            UseShellExecute = false
        };

    p.Start();
    p.WaitForExit();

    Console.WriteLine( "World" );
    Console.ReadLine();
}
它给了我这个输出:


使用
线程进行循环有什么特别的原因吗?睡眠
而不是监听
进程。退出
并与等待句柄同步?没有,没有特别的原因,只是懒惰,请随意编辑我的答案以反映这一极好的建议。或者您可以使用
进程。WaitForExit
:)