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

本文关键字:方法 Java 代码 编译 | 更新日期: 2023-09-27 17:56:17

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

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

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

你还有其他选择。Java提供了JNI(Java原生接口),它允许Java调用原生代码apropos,让原生代码调用Java(尽管以一种相当复杂的方式)。

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

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

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

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

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

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

您的命令行代码看起来与我见过的示例相似,因此我预计没有太大的改进空间。 因此,对你的问题的简短回答是:不,你很好(无论如何,从C#编译Java一样好)。

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

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

等等...