如何从C#执行Java程序?

时间:2009-05-17 02:51:06

标签: c# java

想知道是否有人知道在运行时从C#代码执行Java命令行程序的好方法?

是否与执行原生.EXE文件相同?

它会同步还是异步运行(这意味着我可能要等待线程完成才能找到结果)

具体来说,我想从服务器端的Web应用程序调用一个小实用程序(恰好用Java编写)来对文本文件进行一些处理。我想等待它完成,因为在Java程序完成处理文本文件之后我想抓取已处理的文本,并在C#应用程序中使用它。

7 个答案:

答案 0 :(得分:21)

var processInfo = new ProcessStartInfo("java.exe", "-jar app.jar")
                      {
                          CreateNoWindow = true,
                          UseShellExecute = false
                      };
Process proc;

if ((proc = Process.Start(processInfo)) == null)
{
    throw new InvalidOperationException("??");
}

proc.WaitForExit();
int exitCode = proc.ExitCode;
proc.Close();

答案 1 :(得分:16)

如果你需要比启动外部程序更精细的控制,那么考虑IKVM - http://www.ikvm.net/ - 它提供了一种在.NET世界中运行Java程序的方法。

答案 2 :(得分:10)

它与执行本机.EXE文件相同,只是您必须执行的可执行文件是JVM本身(java.exe)。

所以,在你的C#代码调用中:

  

java.exe -jar nameofyourjavaprogram.jar

你应该没事。

如果您没有JAR库上的Java程序,只需使用您需要的所有参数启动JVM。

答案 3 :(得分:5)

我在上述解决方案中添加了几行。我想从Silverlight应用程序调用Web服务,该应用程序使用服务器上的java处理某些文件。上面的解决方案是有帮助的,但我修改了一点,因为它通过Web服务调用有点棘手。现在你有了适合工作的工具,C#在适当的时候,当C#无法解决问题时的Java。知道不仅仅是一种做事方式总是好的。现在我在.Net中创建的Web服务可以与Java通信。

private void Merge(string strPath)
{
  var processInfo = new ProcessStartInfo("C:\\Program Files\\Java\\jdk1.6.0_24\\binjava.exe", "-jar app.jar")
  {
     CreateNoWindow = true,
     UseShellExecute = false
  };

  processInfo.WorkingDirectory = strPath; // this is where your jar file is.
  Process proc;

  if ((proc = Process.Start(processInfo)) == null)
  {
    throw new InvalidOperationException("??");
  }

  proc.WaitForExit();
  int exitCode = proc.ExitCode;
  proc.Close();
}

答案 4 :(得分:2)

  

它会同步还是异步运行

如果你有足够的内核,它将异步运行,否则它会独立运行,但你的线程必须上下文切换,以便其他程序运行。无论哪种方式,都不需要担心。

答案 5 :(得分:2)

如果您使用jni4net - C#/Java bridge

,也许会运行得更快

答案 6 :(得分:2)

只是为了完整性: 当从C#推出Swing jar时,我发现了这个细节:如果你没有在ProcessStartInfo对象中设置工作目录,那么闪亮的Swing应用程序将启动... 但没有图标,没有图像! !

这是从SO和其他地方的答案复制的最小工作代码(适用于我:Win7上的Java 1.8,mi图像和图标位于workingDirectory的子文件夹中):

ProcessStartInfo psi = new ProcessStartInfo("java.exe", " -jar \"C:\\Program Files\\Installed Shiny Swing jar app\\Myjar.jar\"");
psi.WorkingDirectory = "C:\\Program Files\\Installed Shiny Swing jar app\\"; // Do not miss this line so you awesome Swing app will show default java icon and no images
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process p = new Process();
p.StartInfo = psi;
p.Start();