代码之家  ›  专栏  ›  技术社区  ›  Freddy

Mono中当前进程的控制台重定向

  •  2
  • Freddy  · 技术社区  · 16 年前

    
    class Program
    {
         Main(string[] args)
         {
               Program prog = new Program();
               Process proc = Process.GetCurrentProcess();
               proc.StartInfo.RedirectStandardOutput =  true;
               proc.StartInfo.RedirectStandardError = true;
               proc.EnableRaisingEvents = true;
               proc.ErrorDataReceived += prog.DataReceived;
               proc.OutputDataReceived += prog.DataReceived;
               proc.BeginErrorReadLine();
               proc.BeginOutputReadLine();
         }
         void DataReceived(object sender, DataReceivedEventArgs e)
         {
               _MainWindow.SendData(e.Data);
         }
    }
    

    这是正确的方法吗?现在我在调用 BeginErrorReadLine() Standard Error Can not be redirected . 我不知道问题是否只是过程/单一的东西,或者我只是做错了什么。

    2 回复  |  直到 16 年前
        1
  •  2
  •   dtb    16 年前

    我相信您不能在进程启动后重定向stdout(这是当前进程的情况)。

    Console.SetOut Method :

    FileStream fs = new FileStream("Test.txt", FileMode.Create);
    StreamWriter sw = new StreamWriter(fs);
    
    Console.SetOut(sw);
    Console.WriteLine("Hello World");
    

    这会将“Hello World”的输出重定向到文本文件。

    您需要实现自己的TextWriter,将所有文本写入gtk#textview。


    abstract class Stdout
    {
        public static readonly Stdout Instance = // ...
    
        public abstract void WriteLine(string s);
    
        private class Console : Stdout
        {
            public override void WriteLine(string s)
            {
                Console.WriteLine(s);
            }
        }
    
        private class Gui : Stdout
        {
            public override void WriteLine(string s)
            {
                // append to gtk# textview
            }
        }
    }
    
        2
  •  2
  •   anthony    16 年前

    你可能对使用Vte感兴趣。Vte是gnome终端使用的终端仿真小部件。它有C#绑定,包括gnome夏普。

    实际上,您可以告诉它使用一种方法启动一个进程。 Here is the documentation for the Vte.Terminal class ForkCommand() 方法。