我正在编写一个需要运行java.jar服务器的程序。我需要直接运行该过程,以便我可以将输出重写为文本框,并且所有内容都可以完全控制它。我试过通过CMD.exe做这件事,但那不行,因为CMD.exe只会调用一个新进程java.exe而我无法控制它。我需要直接调用java.exe,这样我就可以拥有控件并获得输出。您是否可以告诉我如何转换此命令,以便我可以在C#中创建一个进程并调用它?
我需要转换CMD命令:
“java -Xmx1024m -cp ./../libs/*;l2jserver.jar net.sf.l2j.gameserver.GameServer”
进入
我可以将一个命令行放入Process.Arguments,这样我就可以直接调用Java.exe。
我已经尝试过了......它只是不起作用。
我一直在看这个好几个小时......请有人帮忙!
答案 0 :(得分:4)
部分问题可能是,尽管Framework文档说使用Process并不总是正确地解决PATH环境变量。如果您知道Java所在文件夹的名称,请使用Java.exe的完整路径,否则请使用如下函数:
private void LocateJava()
{
String path = Environment.GetEnvironmentVariable("path");
String[] folders = path.Split(';');
foreach (String folder in folders)
{
if (File.Exists(folder + "java.exe"))
{
this._javadir = folder;
return;
}
else if (File.Exists(folder + "\\java.exe"))
{
this._javadir = folder + "\\";
return;
}
}
}
它有点hacky但是如果安装了Java Runtime并且它的文件夹在windows PATH变量中,它会找到java.exe。在程序第一次需要查找Java然后使用以下命令启动Java时调用此函数:
//Prepare the Process
ProcessStartInfo start = new ProcessStartInfo();
if (!_javadir.Equals(String.Empty)) {
start.FileName = this._javadir + "java.exe";
} else {
start.FileName = "java.exe";
}
start.Arguments = "-Xmx1024m -cp ./../libs/*;l2jserver.jar net.sf.l2j.gameserver.GameServer";
start.UseShellExecute = false;
start.RedirectStandardInput = true;
start.RedirectStandardOutput = true;
//Start the Process
Process java = new Process();
java.StartInfo = start;
java.Start();
//Read/Write to/from Standard Input and Output as required using:
java.StandardInput;
java.StandardOutput;