有哪些方法可以从C#代码编译Java?

时间:2013-01-28 18:27:20

标签: c# javac

我正在用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);

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您还有其他选择。 Java提供了JNI(Java Native Interface),它允许Java调用本机代码和* apropos本机代码来调用Java(虽然方式相当复杂。)

根据您希望的学习体验的多少,您可以直接使用JNI或使用jni4net等库。一个不同的互操作方法是使用ikvm,这是一个在clr中运行的jvm,但我不认为它对你有用,因为它不包含编译器。

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

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

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

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

答案 3 :(得分:0)