Process.Start的替代原生api

时间:2010-04-13 18:07:52

标签: c# process pinvoke

好的,这不是“Alternative to Process.Start()”的重复,因为我的问题在这里有所不同。

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

有办法将RedirectStandardOutput和RedirectStandardError设置为true,但是这在某些机器上运行不正常(没有安装.NET SDK),只安装了.NET运行时,现在它可以在某些机器上运行而且不起作用在某些机器上所以我们不知道问题出在哪里。

我有以下代码,

        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语句。

3 个答案:

答案 0 :(得分:1)

这可能是你的孩子过程真的永远挂起,例如。等待输入或显示不可见的错误对话框?

原生API为CreateProcess,并且对应pInvoke

答案 1 :(得分:0)

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

听起来像问题,在这种情况下,是你的“myapp.exe”。出于某种原因,该应用程序不会终止于这些计算机上。如果您发现导致这种情况的原因,您可能可以使用Process.Start正确地完成此工作。

答案 2 :(得分:0)

好的我从某个地方得到了这个答案......

    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();