想知道是否有人知道在运行时从 C# 代码执行 Java 命令行程序的好方法?
和执行原生.EXE文件一样吗?
它会同步运行还是异步运行(这意味着我可能必须等待线程完成才能找出结果)
具体来说,我想从服务器端的 Web 应用程序调用一个小实用程序(恰好是用 Java 编写的)来对文本文件进行一些处理。 我想等待它完成,因为在 Java 程序处理完文本文件后,我想抓取处理后的文本,并在 C# 应用程序中使用它。
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();
如果您需要比启动外部程序更精细的控制,请考虑 IKVM - http://www.ikvm.net/ - 它提供了一种在 .NET 世界中运行 Java 程序的方法。
这与执行本机 .EXE 文件相同,只是您必须执行的可执行文件是 JVM 本身 (java.exe)。
因此,在您的 C# 代码调用中:
java.exe -jar nameofyourjavaprogram.jar
你应该没问题。
如果您的 JAR 库中没有 Java 程序,只需使用您需要的所有参数启动 JVM。
我在上面的解决方案中添加了几行。 我想从 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();
}
它是同步运行还是异步运行
如果您有足够的核心,它将异步运行,否则它将独立运行,但您的线程必须进行上下文切换,以便其他程序运行。 无论哪种方式,您都不应该担心。
为了完整性: 当从 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();