C# Process.Start的替代本机api

C# Process.Start的替代本机api,c#,process,pinvoke,C#,Process,Pinvoke,好的,这不是“”的重复,因为我的问题在这里有所不同 我需要运行一个进程,等待进程的执行,并获得控制台的输出 有一种方法可以将RedirectStandardOutput和RedirectStandardError设置为true,但是在某些机器上(未安装.NET SDK的机器上)功能不好,只安装了.NET runtime,现在它在某些机器上工作,在某些机器上不工作,因此我们不知道问题出在哪里 我有以下代码 ProcessStartInfo info = new ProcessSta

好的,这不是“”的重复,因为我的问题在这里有所不同

我需要运行一个进程,等待进程的执行,并获得控制台的输出

有一种方法可以将RedirectStandardOutput和RedirectStandardError设置为true,但是在某些机器上(未安装.NET SDK的机器上)功能不好,只安装了.NET runtime,现在它在某些机器上工作,在某些机器上不工作,因此我们不知道问题出在哪里

我有以下代码

        ProcessStartInfo info = new ProcessStartInfo("myapp.exe", cmd);
        info.CreateNoWindow = true;
        info.UseShellExecute = false;
        info.RedirectStandardError = true;
        info.RedirectStandardOutput = true;
        Process p =  Process.Start(info);
        p.WaitForExit();
        Trace.WriteLine(p.StandardOutput.ReadToEnd());
        Trace.WriteLine(p.StandardError.ReadToEnd());
在某些机器上,这将永远挂在p.WaitForExit()上,而在某些机器上,它工作正常,行为非常随机,没有任何线索

现在如果我能用pinvoke找到一个很好的解决方法,我会很高兴的


myapp.exe只是在屏幕上写10条hello world语句。

是否您的子进程真的永远挂起,例如等待输入或显示不可见的错误对话框


本机API是,并且它是相应的。

通过调用本机代码使用单独的解决方法并不能解决问题。Process API只是本机的一个薄薄包装器——直接使用它们只会使代码更加混乱,并导致其他问题


在本例中,问题似乎是您的“myapp.exe”。由于某些原因,该应用程序没有在这些计算机上终止。如果您发现是什么原因导致了这种情况,您很可能能够使用Process.Start使其正常工作。

好的,我从某处得到了这个答案

    using System.Diagnostics;
    using System.Threading;

    ProcessStartInfo info = new ProcessStartInfo("myapp.exe", cmd); 
    info.CreateNoWindow = true; 
    info.UseShellExecute = false; 
    info.RedirectStandardError = true; 
    info.RedirectStandardOutput = true; 
    Process p =  new Process();
    p.StartInfo = info; 
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();

    AutoResetEvent wait = new AutoResetEvent(false);

    p.Exited += (s,e)=>{
        wait.Set();
    }
    p.Start();
    wait.WaitOne();

myapp.exe只不过是在屏幕上写10条hello world语句而已。myapp.exe只不过是在屏幕上写10条hello world语句而已,CreateProcess太复杂了,我无法正确设置所有值,所以我想知道是否有人在CreateProcess上做了很好的包装,这将很有帮助。