通过C#代码编译Java有什么方法?

问题描述 投票:7回答:4

我正在用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# javac
4个回答
3
投票

您还有其他选择。 Java提供JNI(Java本机接口),它允许Java适当地调用本机代码,本机代码也可以调用Java(尽管以相当复杂的方式。)

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

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

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

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

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


2
投票

快速浏览表明(毫不奇怪),没有用于编译Java的.Net API。因此,最简单的方法可能是像当前正在通过命令行使用javac

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


2
投票

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


© www.soinside.com 2019 - 2024. All rights reserved.