Frage

Ich habe Schwierigkeiten die Ausgabe von einer Konsolenanwendung auf eine Windows Form App Umleitung, wenn der Prozess in einem separaten * DLL-Datei erstellt wird (entschuldigen Sie die schlampig Terminologie, aber ich bin neu in der Programmierung). Ich stieß auf diesen Link (und ich kann seine Methode verfolgen), ein ähnliches Problem Detaillierung: http://www.codeproject.com/KB/threads/launchprocess.aspx?msg=3087118 ich eine Zeile von der Konsole lesen kann, aber wie es zu bekommen, offen zu bleiben?

Also im Grunde meine Frage ist, wie man Stream Ausgabe von innerhalb einer separaten Klasse greift richtig?

Der folgende Code funktioniert perfekt , wenn sie lokal genannt.

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();
    }

Allerdings mag ich in der Lage sein, die Ausgabe von einer separaten Klasse umgeleitet zu haben, wenn sie aufgerufen wird. Atm Ich kann nur die erste Zeile von der Konsole erhalten, und es nicht zu aktualisieren.

private void exampleErrorRedirection()
    {

        exampleDLLFile.startProc ConsoleApp new exampleDLLFile.startProc();

        ConsoleApp.Run();

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

, wo die Klasse Häuser ein Verfahren wie folgt:

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();

    }
}
War es hilfreich?

Lösung

Sie müssen hinzufügen DataReceivedEventHandler für die Veranstaltung 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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top