2

我正在编写一个需要运行 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。

我已经尝试过……但它只是行不通。

我已经看了好几个小时了......请有人帮忙!

4

1 回答 1

4

部分问题可能是尽管框架文档说使用 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.exe,前提是安装了 Java Runtime 并且它的文件夹位于 windows PATH 变量中。当您的程序第一次需要查找 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;
于 2009-05-26T08:05:11.227 回答