C# Konsolenbefehl in Java-VM ausführen

DaMoN1993

Commander
Registriert
Dez. 2006
Beiträge
2.118
Hallo Forum,
Ich will mir zZt. ein kleines Tool für ein bereits existierendes Programm Schreiben.
Genauer gesagt, will ich ein installations-tool für den BUKKIT-server basteln.
Bukkit startet in der Kommandozeile, genauer gesagt in einer instanz einer java-vm. (?)
Sobald der Server gestartet ist, kann der benutzer über die kommandozeile befehle eingeben und ausführen.
Dies will ich nun mit c# tun.
Der Prozess wird korrekt gestartet, ich leite den Input sowie Output-stream um.
Jedoch habe ich mit
Code:
                    process.StandardInput.WriteLine("stop");
                    process.StandardInput.Flush();
keinen Erfolg. process ist das Objekt für den gestarteten Prozess, dieses wurde nur mit ProcessStartInformation gefüttert, initialisiert, und es wird einmal abgefragt ob der Prozess gestartet ist.
Code:
                ProcessStartInfo psi = new ProcessStartInfo("java");
                psi.Arguments = "-Xms1024M -Xmx1024M -jar \"D:\\bukkit\\craftbukkit-0.0.1-SNAPSHOT.jar\"";
                psi.WorkingDirectory = "D:\\bukkit";
			    psi.UseShellExecute = false;
			    psi.CreateNoWindow = true;
			    psi.RedirectStandardInput = true;
			    psi.RedirectStandardOutput = true;
			    Process process = new Process();
			    process.StartInfo = psi;
			    bool started = process.Start();

Die StandardOutput-Zeilen kann ich nicht mit ReadLine abfragen bis ich alle vorherigen Zeilen abgefragt habe, die Anzahl variiert immer, und ab einem bestimmten Punkt wird nur ">" zurückgegeben, obwohl etwas anderes in der Konsole steht.
mit cmd klappt das WriteLine beim StandardInput mit anschließendem flush, das wird anstandslos ausgeführt. der stop-befehl allerdings nicht.
Woran liegt das? Gibt es eine andere (bessere) methode, wie ich einen Befehl an die Kommandozeile des java-prozesses senden kann?
MfG
Damon
 
Hast du denn den Sourcecode von Bukkit?

Programmier doch direkt in Java. Die Syntax von Java und C# ist sich so ähnlich, da solltest du einfach mal versuchen deinen C# Code zu übersetzen.
 
Wollte sowas ähnliches auch mal für den normalem Minecraft Server machen.
Wegen dem fehlenden Output kannst probieren noch StandardError umzuleiten und abzufragen, das war beim normalen Minecraft Server das komische.

Code:
java.StandardInput.WriteLine("stop");
hat bei mir aber ganz normal funktioniert.
 
Hey,
Ich werde es gleich ausprobieren und darüber berichten.
In Java selbst will ich nicht schreiben, die syntax ist sehr ähnlich, aber der performance ist naja...
ich bleibe lieber bei c#, auch für das kleine projekt.
Aber nur nebenbei: ja, bukkit ist open source, der quellcode ist für jedermann zugänglich.

MfG
Damon
 
Den StandardError umzuleiten hat leider nichts gebracht bei mir.
Sind noch irgendwelche using-direktiven nötig?
zzT sind drin:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Diagnostics;

und hier der code der kompletten methode:
Code:
        public void cmd()
        {
            try {
                ProcessStartInfo psi = new ProcessStartInfo("java");
                psi.Arguments = "-Xms1024M -Xmx1024M -jar \"D:\\bukkit\\craftbukkit-0.0.1-SNAPSHOT.jar\"";
                psi.WorkingDirectory = "D:\\bukkit";
			    psi.UseShellExecute = false;
			    psi.CreateNoWindow = true;
			    psi.RedirectStandardInput = true;
			    psi.RedirectStandardOutput = true;
                psi.RedirectStandardError = true;
			    Process process = new Process();
			    process.StartInfo = psi;
			    bool started = process.Start();
                string str;
			    if (started)
			    {
                    process.StandardInput.WriteLine("stop");
                    process.StandardInput.Flush();
                    started = process.HasExited;
			    }
		    } 
            catch (Exception e) 
            {
                MessageBox.Show(e.Message);
		    }

        }

es sind noch ein paar Sachen drin vom herumprobieren ;)

Wie gesagt, der Prozess wird korrekt gestartet und macht alles was er soll, nur das beenden klappt nicht.

bei cmd kann ich einfach den prozess starten, per writeline+flush echo irgendwas ausführen lassen, und mit ReadLine sehe ich auch, dass es geklappt hat.
ich bin überfragt...
MfG
Damon
 
Es könnte sein, dass dein aufgerufener Prozess nach dem Empfang des "stop" Kommandos noch etwas nach StandardOutput oder StandardError schreiben will. Wenn du das dann nicht in deinem Prozess einliest, könnte es zu einem deadlock kommen. Der aufgerufen Prozess will in den Ausgabepuffer schreiben, dieser ist aber gefüllt, wird nicht ausgelesen und der Prozess blockiert. Probiere nach dem Senden des "stop" Kommandos Standardoutput und StandardError des aufgerufenen Prozesses zu lesen.
 
Zurück
Oben