25

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

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

4

6 回答 6

24

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

于 2009-10-31T19:25:51.467 回答
11

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

于 2008-11-12T12:03:50.667 回答
5

你看过IKVM吗?

于 2008-11-12T11:37:16.227 回答
3

你看过 Java 原生接口吗?

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

如果您只想公开几个方法,JNI 会很好地工作,但如果您想公开整个 .NET 框架,它可能会变得笨拙,因为您需要创建的头文件和包装器方法的数量.

于 2008-11-12T11:41:34.423 回答
1

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

于 2008-11-12T11:45:36.553 回答
1

如果您愿意在 .NET(或 Mono)下运行 Java 代码,则可以使用IKVM来实现。

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

ikvmstub mscorlib

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

然后,您可以编写一个使用它的 Java 文件,例如(基于 IKVM 文档中的示例):

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 方法打印当前目录中的文件。

于 2012-07-27T07:14:05.280 回答