4 Stimmen

Aufrufen eines Ruby-Skripts in C#

Wie machen Sie einen Aufruf zu einem Ruby-Skript und übergeben Sie einige Parameter und sobald das Skript beendet ist, geben Sie die Kontrolle zurück an den C#-Code mit dem Ergebnis?

4voto

Jake Punkte 7210
void runScript()
{
    using (Process p = new Process())
    {
        ProcessStartInfo info = new ProcessStartInfo("ruby C:\rubyscript.rb");
        info.Arguments = "args"; // set args
        info.RedirectStandardInput = true;
        info.RedirectStandardOutput = true;
        info.UseShellExecute = false;
        p.StartInfo = info;
        p.Start();
        string output = p.StandardOutput.ReadToEnd();
        // process output
    }
}

2 Stimmen

Das ist eine schreckliche Antwort. Sie hat das klassische "Deadlock on redirection of both stdout and stderr"-Problem, vor dem sogar in den MSDN-Dokumenten gewarnt wird. Es ist schrecklich, Code zu schreiben, der beide Ströme umleitet und dann nur einen von ihnen konsumiert.

0 Stimmen

@PeterDuniho Ich bin mir nicht sicher, was ich von Ihrem Kommentar halten soll, da Sie weder Referenzen noch eine geeignete Lösung angegeben haben. Würden Sie empfehlen, einfach die Eingabeumleitung zu entfernen?

0 Stimmen

Wie in meinem Kommentar erwähnt, sind diese Informationen in der MSDN-Dokumentation enthalten. Siehe z.B.. ProcessStartInfo.RedirectStandardOutput-Eigenschaft . Suchen Sie auf der Seite nach dem Wort "Deadlock". Sie sollten keine Schwierigkeiten haben, die Informationen zu finden. Ihr Codebeispiel tut genau das, wovor gewarnt wird: Sie leiten sowohl stdout als auch stderr um und lesen dann keines von beiden asynchron (Ihr Beispiel liest stderr überhaupt nicht, daher ist nicht klar, warum Sie sich die Mühe gemacht haben, es umzuleiten).

2voto

Bedasso Punkte 1552

Nur um kleinere Lücken zu füllen, habe ich die gleiche Funktionalität mit der Möglichkeit des asynchronen Zugriffs auf den OutputStream implementiert.

public void RunScript(string script, string arguments, out string errorMessage)
{
    errorMessage = string.empty;
    using ( Process process = new Process() )
    {
        process.OutputDataReceived += process_OutputDataReceived;
        ProcessStartInfo info = new ProcessStartInfo(script);
        info.Arguments = String.Join(" ", arguments);
        info.UseShellExecute = false;
        info.RedirectStandardError = true;
        info.RedirectStandardOutput = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        process.StartInfo = info;
        process.EnableRaisingEvents = true;
        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
        errorMessage = process.StandardError.ReadToEnd();
    }
}

private void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    using ( AutoResetEvent errorWaitHandle = new AutoResetEvent(false) )
    {
        if ( !string.IsNullOrEmpty(e.Data) )
        {
            // Write the output somewhere
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X