2009-07-01 10 views
1

Ich versuche gerade, ein Programm zu entwickeln, das die Ausgabe eines vorhandenen Programms (in C geschrieben) verwendet und es als Eingabe (in C#) verwendet. Das Problem, das ich habe, ist, dass das vorhandene Programm Daten im redundanten Format druckt, aber es dynamisch ändert. Ein Beispiel könnte ein zufälliger Namensgenerator sein, und ich muss ein Programm erstellen, das alle zufälligen Namen so protokolliert, wie sie erscheinen.C-Ausgabe in C# -Eingabe konvertieren

Konnte ich nur diese und diesen Ausgang packen, wie es kommt? Das C-Programm wird von einer CLI ausgeführt.

Antwort

3

Sie können die Ausgabeströme vom Process-Objekt umleiten, um direkten Zugriff darauf zu erhalten. Sie führen einen Anruf durch und rufen ein Ereignis Ihrer Wahl auf, wenn die Ausgabe empfangen wird. Eine meiner Fragen kann eine Erklärung darüber, wie dies zu tun - C# Shell - IO redirection:

processObject.StartInfo.RedirectStandardOutput = true; 
processObject.OutputDataReceived += new DataReceivedEventHandler(processObject_OutputDataReceived); 
/* ... */ 
processObject.Start(); 
processObject.BeginOutputReadLine(); 

Und dann später:

public void processObject_OutputDataReceived(object sender, DataReceivedEventArgs e) { 
    ProcessNewData(e.Data); 
} 

Beachten Sie, dass dies die Newline enthält.

Oder Sie können einfach es Rohr und verwenden Console.ReadLine es in zu lesen, in der Befehlszeile, würden Sie ausführen:

cprogram | csharp_program 

Leider Sie können dies nicht direkt mit dem Objekt-Prozess - nur verwenden. die obige Methode. Wenn Sie sich für diese Route entscheiden, können Sie Folgendes verwenden:

string input = ""; 
int currentChar = 0; 

while ((currentChar = Console.Read()) > -1) { 
    input += Convert.ToChar(currentChar); 
} 

Welche liest von der Eingabe bis EOF.

+0

Hmm Ich könnte in meiner Beschreibung etwas irreführend gewesen sein. Das ursprüngliche Programm ist in C geschrieben, wird aber über CLI in Linux ausgeführt. Einige der vorhandenen Bibliotheken existieren auch nur auf der Linux-Seite dieser Maschine, so dass ich vielleicht vergeblich versuche, dies in C# zum Laufen zu bringen (aber C# ist so schön für GUI's!) –

+0

Oh, CLI! Ich habe es als CLR gelesen. Hoppla. :-) Sie könnten Ihr Programm in Mono arbeiten lassen - die meisten verzichten auf Änderungen. –

+0

Ich habe versucht, eine Version von Mono für RHELv5 zu finden, aber alles, was ich sah, war "andere Lisnux", hahah, es ist besser als nichts. –

0

Wenn das C# Programm wird auch Kommandozeilen-basierte, diesen Befehl von der Befehlszeile ausgeführt werden ketten sie zusammen:

my_c_program.exe | my_csharp_program.exe 

Die C# Programm wird die Ausgabe des C-Programms erhält, über seinen Standard Eingabestrom (Console.Read, etc.)