Ausgabe eines Konsolenprogrammes umleiten

D

Dragosani

Hallo,

ich hoffe, daß es das Thema noch nicht gab, zumindest fand ich da irgendwie nichts (nur einen Thread und da verstand ich als Anfänger wirklich nicht sehr viel).

Zu meinem Problem: ich habe eine kleine Anwendung in C# "geschrieben" (geklickt paßt da besser), welche ein Programm (Konsolenprogramm inkl. Parameter) öffnen soll. Das ist auch kein Problem, nur möchte ich die Ausgabe nicht in dem DOS-Fenster haben, sondern viel lieber in einer textBox.

Hier mal der kurze Code so far:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace sucher
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = "Starting: "+textBox1.Text;
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("sucher.exe", "-qsort");

            System.Diagnostics.Process.Start(startInfo);
        }
    }
}

Ich muss dazu sagen, daß ich mit C# gerade erst angefangen habe, als "sprecht" langsam mit mir ;)

Wäre super nett, wenn ihr da Lösungshinweise hättet
 
Danke schonmal ihr beiden :)

Hm, ich habe mal versucht, dies bei mir einzubauen, wie ich es mir gedacht habt .. leider ohne viel Erfolg :confused:

Hier mal mein Versuch:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace sucher
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ProcessStartInfo psi = new ProcessStartInfo(""sucher.exe", "-qsort");
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            Process p = new Process();

            p.OutputDataReceived +=
                new DataReceivedEventHandler(p_OutputDataReceived);
            p.StartInfo = psi;
            p.Start();
            p.BeginOutputReadLine();

            p.WaitForExit();
        }
        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            textBox2 = Debug.WriteLine(e.Data);
        }
    }
}

Sprich ich hatte gehofft, daß nun die Ausgabe des Konsolenprogramms in meiner Textbox( textBox2) erscheint, leider war dem nicht so, sondern ich erhielt nur einen Fehler:

F:\C#\sucher\Form1.cs(39,50): error CS0246: The type or namespace name 'DataReceivedEventArgs' could not be found (are you missing a using directive or an assembly reference?)

Was fehlt denn da? :confused:
 
Es fehlt die Klasse DataReceivedEventArgs. Sollte aus der Fehlermeldung ersichtlich sein ;-)

Dennoch meine Schuld, da hier anscheinend diese Klasse im gegebenen Beispiel fehlt. Das sollte dann in etwa so aussehen:
Code:
public class DataReceivedEventArgs : EventArgs
{
  private string _data;

  public string Data
  {
    get { return this._data; }
    set { this._data = value; }
  }

  public DataReceivedEventArgs(string data)
  {
    _data = data;
  }
}
Dann brauchst du noch einen Delegaten, der wie folgt definiert wird:
Code:
public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
Diesen ausserhalb der Klasse definieren.

Ich hoff ich hab mich jetzt nicht vertippt. Hab die Sourcen gerade nicht bei der Hand.
 
Hm, leider klappte das auch nicht (ist mir schon peinlich es zu schreiben). War ich zu blöde es einzubauen?

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace sucher
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);
        public class DataReceivedEventArgs : EventArgs
        {
            private string _data;

            public string Data
            {
                get { return this._data; }
                set { this._data = value; }
            }

            public DataReceivedEventArgs(string data)
            {
                _data = data;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            
            ProcessStartInfo psi = new ProcessStartInfo("sucher.exe", "-qsort");
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            Process p = new Process();

            p.OutputDataReceived +=
                new DataReceivedEventHandler(p_OutputDataReceived);
            p.StartInfo = psi;
            p.Start();
            p.BeginOutputReadLine();

            p.WaitForExit();
        }
        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            textBox2 = Debug.WriteLine(e.Data);
        }
    }
}

Diesesmal noch mehr Fehler (die ich leider nicht verstehe, weil ich nicht so recht weiß, was Dein zusätzlicher Quellcode macht :-()

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Csc.exe /noconfig /nowarn:1701,1702 /errorreport: prompt /warn:4 /define:TRACE /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Deployment.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug: pdbonly /optimize+ /out:eek:bj\Release\sucher.exe /resource:eek:bj\Release\sucher.Form1.resources /resource:eek:bj\Release\sucher.Properties.Resources.resources /target:winexe /win32icon:icon.ico Form1.cs Form1.Designer.cs Program.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Properties\Settings.Designer.cs
F:\C#\sucher\Form1.cs(41,13): error CS0246: The type or namespace name 'ProcessStartInfo' could not be found (are you missing a using directive or an assembly reference?)
F:\C#\sucher\Form1.cs(41,40): error CS0246: The type or namespace name 'ProcessStartInfo' could not be found (are you missing a using directive or an assembly reference?)
F:\C#\sucher\Form1.cs(44,13): error CS0246: The type or namespace name 'Process' could not be found (are you missing a using directive or an assembly reference?)
F:\C#\sucher\Form1.cs(44,29): error CS0246: The type or namespace name 'Process' could not be found (are you missing a using directive or an assembly reference?)
F:\C#\sucher\Form1.cs(56,24): error CS0103: The name 'Debug' does not exist in the current context
 
Du musst natürlich die verwendeten Namespaces referenzieren:
Code:
using System.Diagnostics;

Ah, ich verstehe .. das macht tatsächlich auch für mich Sinn :) Hm, wie bekomme ich eigentlich solche Namespaces heraus, wenn man sie wie ich noch nicht kennt?

Leider bekam ich noch zwei Fehler. Einmal hier:
Code:
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
und zwar diesen:
F:\C#\sucher\Form1.cs(47,66): error CS0029: Cannot implicitly convert type 'sucher.Form1.DataReceivedEventHandler' to 'System.Diagnostics.DataReceivedEventHandler'
Und dann bei der Ausgabe in die Textbox (wohl doch nicht so simpel, wie ich es mir dachte :-():
Code:
        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            textBox2 = Debug.WriteLine(e.Data);
        }
Fehler:
F:\C#\sucher\Form1.cs(56,24): error CS0029: Cannot implicitly convert type 'void' to 'System.Windows.Forms.TextBox'
Hm, VOID bedeutet ja, daß es keine Rückgabe gibt, aber wieso ist das hier ein Problem - eine Ausgabe sollte doch eigentlich möglich sein?

PS: Schonmal vielen, vielen Dank für Deine Mühen und vor allem für Deine Ausdauern einem Anfänger gegenüber :-(
 
Mensch, gestern hab ich wohl wieder eine Glanzleistung vollbracht.

Der DataReceivedEventHandler und die dazughörigen EventArgs gibt's ja im System.Diagnostics-Namespace. Die eigene Implementierung kannst also wieder rauswerfen, dann sollte es auch funktionieren. Sorry, wohl nicht mitgedacht gestern.
 
Ah, ich verstehe .. das macht tatsächlich auch für mich Sinn :) Hm, wie bekomme ich eigentlich solche Namespaces heraus, wenn man sie wie ich noch nicht kennt?

Hm, VOID bedeutet ja, daß es keine Rückgabe gibt, aber wieso ist das hier ein Problem - eine Ausgabe sollte doch eigentlich möglich sein?
Debug.Writeline dient nicht zu solchen Zwecken!
1. Das Property DataReceivedEventArgs.Data ist schon ein String und muss nicht mehr irgendwie konvertiert werden
2. den Text musst du dem Property TextBox.Text zugewiesen werden nicht einfach der TextBox ;)
3. zu Debug.WriteLine: In VS gibt es ein Output-Fenster, welches dir Ausgaben des Compilers und Linkers anzeigt. Hinzukommen Tracing-Ausgaben, welche über die Klassen Debug (nur im Debug-Mode) und Trace (Debug und Release)
 
Zurück