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

时间:2010-05-20 21:35:36

标签: c# mono monodevelop gtk#

我正在尝试将C#/ Mono应用程序的控制台输出重定向到gtk #textview。这里有数以万计的答案,解释了如何将命令的输出重定向到可想到的任何输出设备。但是,我正在尝试对当前流程做同样的事情。最初应用程序被设计为命令行,知道我想要一个显示所有输出的textview。这就是我现在所拥有的:


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。我不知道问题是否只是Process / Mono的问题,或者我是否只是做错了什么。

2 个答案:

答案 0 :(得分:2)

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

查看Console.SetOut Method

  

将Out属性设置为指定的TextWriter对象。

示例:

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。


或者,因为它是您的程序,您可以使用自定义方法替换对Console.Write / WriteLine的所有调用,该方法将字符串写入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
        }
    }
}

答案 1 :(得分:2)

您可能对使用Vte感兴趣。 Vte是gnome-terminal使用的终端仿真小部件。它有gnome-sharp包含的C#绑定。

您实际上可以告诉它使用一种方法启动流程。 Here is the documentation for the Vte.Terminal class。具体来说,请查看ForkCommand()方法。