Ich möchte ein externes Befehlszeilenprogramm über meine Mono / .NET-App ausführen. Zum Beispiel möchte ich Mencoder ausführen . Ist es möglich:
- Um die Befehlszeilen-Shell-Ausgabe zu erhalten und sie in mein Textfeld zu schreiben?
- Um den numerischen Wert zu erhalten, um einen Fortschrittsbalken mit verstrichener Zeit anzuzeigen?
c#
.net
mono
process.start
stighy
quelle
quelle
Sie können Ihre Ausgabe synchron verarbeiten oder asynchron verarbeiten .
1. Synchrones Beispiel
Beachten Sie, dass es besser ist, beide Ausgaben zu verarbeiten als auch Fehler zu verarbeiten : Sie müssen separat behandelt werden.
(*) Für einige Befehle (hier
StartInfo.Arguments
) müssen Sie die hinzufügen/c
Direktive , sonst friert der Prozess in der einWaitForExit()
.2. Asynchrones Beispiel
Wenn Sie keine komplizierten Operationen mit der Ausgabe ausführen müssen, können Sie die OutputHandler-Methode umgehen, indem Sie die Handler direkt inline hinzufügen:
quelle
In Ordnung, für alle, die sowohl Fehler als auch Ausgaben lesen möchten, aber Deadlocks mit einer der in anderen Antworten angegebenen Lösungen erhalten (wie ich), ist hier eine Lösung, die ich nach dem Lesen der MSDN-Erklärung für
StandardOutput
Eigenschaften erstellt habe.Die Antwort basiert auf dem Code von T30:
quelle
Die Standardmethode für .NET besteht darin, aus dem StandardOutput- Stream des Prozesses zu lesen . In den verknüpften MSDN-Dokumenten gibt es ein Beispiel. Ebenso können Sie aus StandardError lesen und in StandardInput schreiben .
quelle
Es ist möglich, die Befehlszeilen-Shell-Ausgabe eines Prozesses wie hier beschrieben abzurufen: http://www.c-sharpcorner.com/UploadFile/edwinlima/SystemDiagnosticProcess12052005035444AM/SystemDiagnosticProcess.aspx
Dies hängt vom Mencoder ab. Wenn es diesen Status in der Kommandozeile ausgibt, dann ja :)
quelle
Sie können den gemeinsam genutzten Speicher für die beiden Prozesse verwenden, über die kommuniziert werden soll
MemoryMappedFile
Sie erstellen hauptsächlich eine Speicherzuordnungsdatei
mmf
im übergeordneten Prozess mit der Anweisung "using". Erstellen Sie dann den zweiten Prozess, bis er beendet wird, und lassen Sie das Ergebnis in denmmf
using schreiben.BinaryWriter
Lesen Sie dann das Ergebnis ausmmf
dem übergeordneten Prozess Übergeben Sie denmmf
Namen mit Befehlszeilenargumenten oder geben Sie ihn fest ein.Stellen Sie bei Verwendung der zugeordneten Datei im übergeordneten Prozess sicher, dass der untergeordnete Prozess das Ergebnis in die zugeordnete Datei schreibt, bevor die zugeordnete Datei im übergeordneten Prozess freigegeben wird
Beispiel: übergeordneter Prozess
Untergeordneter Prozess
Um dieses Beispiel zu verwenden, müssen Sie eine Lösung mit 2 Projekten erstellen. Anschließend nehmen Sie das Erstellungsergebnis des untergeordneten Prozesses aus% childDir% / bin / debug und kopieren es in% parentDirectory% / bin / debug. Führen Sie dann das aus übergeordnetes Projekt
childDir
undparentDirectory
sind die Ordnernamen Ihrer Projekte auf dem PC viel Glück :)quelle
So starten Sie einen Prozess (z. B. eine Bat-Datei, ein Perl-Skript oder ein Konsolenprogramm) und lassen die Standardausgabe in einem Windows-Formular anzeigen:
Sie finden
ProcessCaller
unter diesem Link: Starten eines Prozesses und Anzeigen seiner Standardausgabequelle
Sie können die Prozessausgabe mit dem folgenden Code protokollieren:
quelle
Die Lösung, die für mich in Win und Linux funktioniert hat, ist die folgende
quelle