Консольное перенаправление текущего процесса в Mono - PullRequest
2 голосов
/ 21 мая 2010

Я пытаюсь перенаправить вывод Консоли приложения C # / Mono в текстовое представление gtk #. Здесь миллионы ответов, объясняющих, как перенаправить вывод команды на любое возможное устройство вывода. Тем не менее, я пытаюсь сделать то же самое в текущем процессе. Первоначально приложение было разработано в виде командной строки, я хочу, чтобы текстовое представление отображало весь вывод. Вот что у меня сейчас:


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 ]

2 голосов
/ 21 мая 2010

Вас может заинтересовать использование Vte.Vte - это виджет эмуляции терминала, используемый gnome-terminal.У него есть привязки C #, включенные в gnome-sharp.

Вы можете фактически сказать ему, чтобы он запускал процесс, используя один метод. Вот документация для класса Vte.Terminal .В частности, посмотрите на метод ForkCommand () .

2 голосов
/ 21 мая 2010

Я полагаю, что вы не можете перенаправить стандартный вывод после запуска процесса (что относится к текущему процессу).

Посмотрите на метод Console.SetOut :

Устанавливает свойство 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 # или консоль, в зависимости от аргумента программы:

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
        }
    }
}
...