【问题标题】:How to execute a Java program from C#?如何从 C# 执行 Java 程序?
【发布时间】:2009-05-17 02:51:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# java


    【解决方案1】:
    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();
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这个工具非常好!!我正坐在一个项目中,从 Java 和 .Net 中的前端应用程序访问大量数据并解决了我所有的问题!
        • 有人知道这个项目是否已经死了? 2012 年似乎是最后一次更新,只有 v7...不是 v8
        • 项目由首席开发者dead确认
        • @Alexander 不,他只是不想再工作了。如果其他人愿意,他们可以。显然没有。
        • @Thorbjørn Ravn Andersen 通常这种情况被认为是死项目......
        【解决方案4】:

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

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

        java.exe -jar nameofyourjavaprogram.jar

        你应该没事的。

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

        【讨论】:

        • 另外请注意,您可以调用一个 DLL,以防您需要从 JVM 中返回一些东西。
        【解决方案5】:

        如果您使用jni4net - C#/Java bridge,它可能会运行得更快

        【讨论】:

          【解决方案6】:

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

          这是从此处和其他地方的答案中复制的最小工作代码(对我有用: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();
          

          【讨论】:

            【解决方案7】:

            是同步运行还是异步运行

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-11-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多