如何从C#执行Java程序?

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

它与执行本机.EXE文件相同吗?

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

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

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

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(); 

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

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

java.exe -jar nameofyourjavaprogram.jar

而你应该没事。

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

我在上面的解决方案中添加了几行。 我想从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(); } 

它会同步还是异步运行

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

只是为了完整性:当从C#推出Swing jar时我发现了这个细节:如果你没有在ProcessStartInfo对象中设置工作目录,那么shiny的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(); 

如果你使用jni4net – C#/ Java桥,它可能运行得更快