我正在尝试将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的问题,或者我是否只是做错了什么。
答案 0 :(得分:2)
我相信你不能在进程启动后重定向stdout(这是当前进程的情况)。
将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()方法。