想知道是否有人知道在运行时从C#代码执行Java命令行程序的好方法?
是否与执行原生.EXE文件相同?
它会同步还是异步运行(这意味着我可能要等待线程完成才能找到结果)
具体来说,我想从服务器端的Web应用程序调用一个小实用程序(恰好用Java编写)来对文本文件进行一些处理。我想等待它完成,因为在Java程序完成处理文本文件之后我想抓取已处理的文本,并在C#应用程序中使用它。
答案 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)
答案 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();