8

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

4 回答 4

3

你还有其他选择。Java 提供了 JNI(Java Native Interface),它允许 Java 调用本机代码适当的,让本机代码调用 Java(尽管以一种相当复杂的方式。)

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

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

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

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

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

于 2013-01-28T21:21:33.750 回答
2

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

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

于 2013-01-28T19:02:15.057 回答
2

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

于 2013-01-28T19:18:09.553 回答
0

有一些免费和商业工具:http: //community.versant.com/Blogs/db4o/tabid/197/entryid/94/Default.aspx http://visualstudiogallery.msdn.microsoft.com/9789645d-9b31 -4033-bcb1-53dc5ff58e05

等等……

于 2013-01-28T19:18:58.227 回答