如何从C#执行Java程序?

问题描述 投票:0回答:7

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

和执行原生.EXE文件一样吗?

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

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

c# java
7个回答
26
投票
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();

18
投票

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


12
投票

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

因此,在您的 C# 代码调用中:

java.exe -jar nameofyourjavaprogram.jar

你应该没问题。

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


7
投票

我在上面的解决方案中添加了几行。 我想从 Silverlight 应用程序调用 Web 服务,该应用程序在服务器上使用 java 处理一些文件。 上面的解决方案很有帮助,但我做了一些修改,以便它可以工作,因为通过网络服务调用有点棘手。 现在您拥有了适合该工作的工具,在适当的情况下使用 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();
}

2
投票

它是同步运行还是异步运行

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



2
投票

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

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

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();
© www.soinside.com 2019 - 2024. All rights reserved.