如何从Java调用.NET代码?

时间:2008-11-12 11:36:38

标签: java .net cross-platform

我不是在寻找像Web服务这样的常见答案。我正在寻找一种可以在同一台机器上运行的轻型解决方案。

编辑:我正在寻找Java中调用.NET方法的方法

6 个答案:

答案 0 :(得分:23)

我是jni4net的作者,JVM和CLR之间的开源进程间桥接。它建立在JNI和PInvoke之上。不需要C / C ++代码。我希望它会对你有所帮助。

答案 1 :(得分:10)

我相信Java可以与COM通信,.NET可以公开COM接口。所以这可能是一个非常轻量级的解决方案,不需要任何第三方。还可以选择使用套接字在程序之间进行通信,这不需要在机器上安装大量的IIS实例。

答案 2 :(得分:5)

你看过IKVM吗?

答案 3 :(得分:2)

你看过Java Native Interface吗?

我过去所做的是编写一个C库,它可以从Java和.NET(以及COM,NSIS脚本语言和其他技术)调用。

如果您只想公开一些方法,那么JNI会运行良好,但是如果您想要公开整个.NET框架,它可能会变得难以处理,因为您将使用头文件和包装方法的数量需要创建。

答案 4 :(得分:1)

我们在生产环境中尝试过IKVM,但它一直在崩溃。我们使用的JNBridge是一个商业产品,但非常稳定,在我们的ASP.NET环境中表现良好。

答案 5 :(得分:0)

如果您愿意在.NET(或Mono)下运行Java代码,则可以使用IKVM执行此操作。

因为(据我所知)当前的Java编译器不读取.NET程序集,所以有两个步骤。首先,您需要generate a stub JAR包含要使用的.NET程序集的签名的虚拟类和方法,以便javac(或您的IDE)知道可用的方法。例如,如果要在Java的主.NET标准库中使用某些内容,请运行

ikvmstub mscorlib

生成存根mscorlib.jar。 (它在Linux下自动为我找到了Mono mscorlib.dll程序集,但是如果它失败了,你可能需要提供DLL的完整路径。)

然后,您可以编写使用它的Java文件,例如(based on the example from the IKVM documentation):

import cli.System.IO.Directory;
public class IKVMTest {
    public static void main(String[] args) {
        for(String file : Directory.GetFiles(".")) // From .NET standard library
            System.out.println(file);              // From Java standard library
    }
}

请注意,CLI包装的前缀为cli.,因此导入cli.System而非System

要编译,请在类路径中包含存根JAR:

javac -classpath mscorlib.jar IKVMTest.java

由于Java链接在运行时发生,因此输出class文件使用所需名称和签名的方法,但是当在IKVM下运行时,您可以使用真正的.NET方法替换虚拟存根方法:

ikvm IKVMTest

它将通过调用.NET方法打印当前目录中的文件。