Вопрос

У меня возникают трудности с перенаправлением выходных данных из консольного приложения в приложение Windows Form, когда процесс создается в отдельном файле * .dll (извините за неаккуратную терминологию, но я новичок в программировании).Я наткнулся на эту ссылку (и я могу воспользоваться его методом), подробно описывающую аналогичную проблему: http://www.codeproject.com/KB/threads/launchprocess.aspx?msg=3087118 Я могу прочитать одну строку с консоли, но как заставить ее оставаться открытой?

Итак, в основном мой вопрос заключается в том, как правильно получить доступ к выводам streamreader из отдельного класса?

Приведенный ниже код работает совершенно когда вызывается локально.

private void exampleErrorRedirection()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = /exampleconsoleapp.exe;
        proc.StartInfo.Arguments = "some arguments that work";
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        if (!proc.Start())
        {
            Console.WriteLine("Error starting");
            return;
        }
        StreamReader reader = proc.StandardError;
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            textBoxForStandardError.Text = line;
        }
        proc.Close();
    }

Однако я хочу иметь возможность перенаправлять выходные данные из отдельного класса при вызове.Atm Я могу получить только первую строку из консоли, и она не обновляется.

private void exampleErrorRedirection()
    {

        exampleDLLFile.startProc ConsoleApp new exampleDLLFile.startProc();

        ConsoleApp.Run();

        while (convert.line != null)
        {
            textBoxForStandardError.Text = ConsoleApp.line;
        }
}

где класс содержит метод, подобный этому:

public class convertFile
{

    public string line;

    public void Run()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = /exampleconsoleapp.exe;
        proc.StartInfo.Arguments = "some arguments that work";
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;

        if (!proc.Start())
        {
            Console.WriteLine("Error starting");

        }

        StreamReader reader = proc.StandardError;
        while ((line = reader.ReadLine()) != null)
        {
            line = reader.ReadLine();
        }

        proc.Close();

    }
}
Это было полезно?

Решение

Вам нужно добавить DataReceivedEventHandler для мероприятия Process.ErrorDataReceived:

// process is Process
process.UseShellExecute = false;
process.RedirectStandardError = true;
process.ErrorDataReceived += DataReceived;
process.Start();
process.BeginErrorReadLine(); // start asynchronous error read
.
.
.
process.CancelErrorRead();

void DataReceived(object sender, DataReceivedEventArgs e) {
    // e.Data is line of redirected standard error
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top