【问题标题】:What are some ways to compile Java from C# code?从 C# 代码编译 Java 有哪些方法?
【发布时间】:2013-01-28 18:27:20
【问题描述】:

我正在用 C# 编写多语言 IDE。现在,它可以作为一个功能合理的编辑器。但是,我现在正在努力添加编译和运行 Java 代码的功能(我知道用 C# 编写它听起来很傻,但我更喜欢使用 C#,而且我需要 Java 支持学校课程)。

在此背景之后,问题是:从 C# 编译 Java 代码的最佳方法是什么?现在,我正在使用System.Diagnostics.Process 类。基本上,我调用编译器的方式与从命令行调用 javac 的方式相同。这是我当前实现的一个粗略示例:

ProcessStartInfo buildInfo = new ProcessStartInfo();
buildInfo.WorkingDirectory = Path.GetDirectoryName(sourcePath);
buildInfo.RedirectStandardOutput = true;
buildInfo.RedirectStandardError = true;
buildInfo.UseShellExecute = false;
Process buildProcess = Process.Start(buildInfo);

我重定向标准输出和错误,因为稍后应用程序会捕获它们以确定编译是否成功。有一个更好的方法吗?感觉有点草率,我想知道我是否忽略了什么。

【问题讨论】:

  • 什么是IDE??您很可能不需要编写 C# 程序来运行 cmd 行编译器工具。最有可能的是,IDE 支持使用参数和整个九码运行自定义命令行命令的能力。这将允许您使用 java 编译器编译您的 java 代码。
  • doh,我错过了前两个词I'm writing a ...不知何故我将其解释为I'm writing in a
  • 现在我看到了票数接近的原因。 ...老实说,我强烈敦促你停止这种做法。在专业环境中,您不会有这种奢侈,只是决定您想要一个自定义 IDE 来使事情变得更方便......(如果它们最终会变得方便的话)而且您完全可以理解这句话“重新发明轮子”。
  • IDE 不仅仅是为了方便 - 它是一种学习体验。我意识到我无法编写 IDE 只是因为我不喜欢手头的那些——这是一个帮助我学习的简单宠物项目。它还需要我在其他主流 Java IDE 中无法获得的特定特性。
  • 我认为如果它关闭,人们会重新打开它。

标签: c# javac


【解决方案1】:

您确实有其他选择。 Java 提供了 JNI(Java Native Interface ),它允许 Java 调用原生代码适当地,让原生代码调用 Java(尽管方式相当复杂。)

根据您希望获得多少学习体验,您可以直接使用 JNI 或使用诸如 jni4net 之类的库。另一种互操作方法是使用 ikvm,它是在 clr 中运行的 jvm,但我认为它对您没有用处,因为它不包含编译器。

您还可以研究替代编译器,例如 gcj 或 ejc。

没有尝试编写 IDE,我不知道这些方法实际上是否比直接使用命令行更好。我的直觉是,对于简单的集成,命令行更容易使用,但场景更复杂,例如具有多个组件的大型项目的增量编译可能需要更紧密的集成。

如果您计划在键入时提供内联调试和错误突出显示等功能,则无论如何都需要更紧密的集成。

IDE 是极其复杂的程序,即使仅仅是编程编辑器也足够复杂。

【讨论】:

  • 这可能是迄今为止我收到的最有帮助的答案。我的程序已经部分支持 GCJ,问题更多的是如何正确支持 JVM。 jni4net 绝对是我一直在寻找的东西,我认为它不存在。关于我的 IDE:这是一个相对简单的 IDE。事实上,我试图尽可能地极简主义,并省略一切并非完全必要的东西。编译和运行确实属于这一类,语法高亮、代码折叠等也属于这一类。这确实是一个复杂的项目,我已经从事了多年。
【解决方案2】:

快速谷歌搜索表明(毫不奇怪)没有用于编译 Java 的 .Net API。因此,最简单的方法可能是通过命令行使用javac,就像您目前所做的那样。

您的命令行代码看起来与我见过的示例相似,所以我不认为还有很大的改进空间。因此,对您的问题的简短回答:不,您很好(无论如何都可以从 C# 编译 Java)。

【讨论】:

  • 是的,我在 Google 上查看过,但谢谢。我想看看其他人是否有我可能错过的任何想法。
【解决方案3】:

您可以使用Java Invocation API 在您的进程中托管JVM,然后通过compiler API 运行编译器。它可能比启动单独的编译器进程进行编译更快,并且肯定会带来良好的学习体验(您需要使用 .NET 端的 P/Invoke 等)。

【讨论】:

  • 其实我也没想到。作为一个学习过程,你当然是对的,但这绝对是我会考虑的事情。
【解决方案4】:

【讨论】:

  • 谢谢,但这不是我要问的。我不需要转换源代码;我想把Java源代码编译成Java平台。
猜你喜欢
  • 2016-03-14
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2015-08-06
相关资源
最近更新 更多