2010-05-20 101 views
2

我正在嘗試將C#/ Mono應用程序的控制檯輸出重定向到gtk#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。我不知道這個問題是否僅僅是過程/單調的事情,或者如果我只是做錯了什麼。

回答

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。


或者,因爲這是你的計劃,你可以替換的字符串寫入GTK#的TextView或控制檯,這取決於程序參數自定義方法Console.Write /的WriteLine所有來電:

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

我之前看過這個,但我使用的是作者,那麼我只能批量獲取控制檯消息,對不對?我需要的是每條消息獨立發送到textview。 – Freddy 2010-05-20 21:43:22

相關問題