Dotnet CLR 将语言代码转换为 MSIL。而 Java 代码被转换为独立于平台的本机代码。我们可以将此 MSIL 转换为本机代码吗?因此,Dotnet 将自动变得独立于平台。
3 回答
请注意这里的术语:
- CLR 不会将“语言代码”转换为 MSIL - 它会即时将 MSIL 转换为本机代码。
- Java 代码不会转换为“独立于平台的本机代码”;那是矛盾的。Java 源代码被转换为与平台无关的 Java 字节码。JVM 将字节码转换为本机代码,就像 CLR 对 MSIL 所做的一样(嗯,在某种程度上)
请注意,MSIL 和字节码都可以被解释;HotSpot 有时会解释,有时会 JIT 编译,而且经常会 JIT 编译多次。.NET 桌面 CLR 目前总是 JIT 编译一次。
同样值得理解的是,字节码仅在您感兴趣的平台上有可用的 JVM 时才与平台无关。MSIL 也是如此。你可以在 Windows 上编译一个 C# 程序,然后在 Mono 下的 Linux 上运行它,如果你的平台有 Mono 的构建并且它不使用 Mono 上不可用的任何库。
现在至于将 MSIL 转换为 Java 字节码……反过来更可行,因为 MSIL通常比 Java 字节码更强大。例如,MSIL 中的自定义值类型和泛型不会轻易转换为字节码。您可能需要更接近用 Java 编写的 CLR 的东西。我敢说有一些聪明的可能性,但也有根本性的困难。即使反过来也不太容易——尤其是如果 Java 7 引入了对字节码的动态调用(而 .NET 中的动态类型是由 DLR 仅作为库执行的)。
这个回复可能有点离题,但值得一提。MSIL 到 Java 字节码可能很难,正如其他人回答问题所详述的那样。但是您可以在源代码级别处理从一个框架到另一个框架的转换。
如果您有一个想要在 .NET 应用程序中使用的 Java 库,请使用IKVM。它使用 IKVMC 将 Java 代码编译成 .NET 程序集,这是一个 Java 字节码到 .NET IL 的转换器。在开始使用它之前,请检查许可条款!
我也很想知道是否可以反过来,即.NET源代码到Java?
我只能部分回答你的问题。
是的,MSIL 可以使用ngen.exe转换为本机代码。但是,在这种情况下,您将失去在不同目标架构上高效运行的能力,例如 32 位与 64 位。此外,您需要创建多个版本,每个目标平台一个。
除此之外,我建议使用库尔特的答案。