如何从Java中调用.NET代码?

26

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

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

6个回答

26
我是jni4net的作者,它是一个开源的JVM和CLR之间的跨进程桥梁。它基于JNI和PInvoke构建,不需要使用C/C++代码。希望它能对你有所帮助。

你的工具很棒!谢谢! :) - davioooh
这个库非常棒!结合反射就更加完美了! - jrey
这个库似乎是一个好主意,但状态被称为“alpha”,而主页上的最新更新似乎是从2011年开始的 :-( - Stefan Winkler
它是否与Mono兼容? - knocte

11

我相信Java能够与COM进行通信,.NET可以公开COM接口。因此,这可能是一种不需要任何第三方工具的轻量级解决方案。另外还有使用套接字在程序之间进行通信的选项,这不需要在机器上安装重量级的IIS。


没错。jacob.dll + jacob.jar - Vladimir Dyuzhev
请问在这种情况下,COM是什么意思? - Xitrum
@Xitrum 组件对象模型(Component Object Model)——微软在Windows平台上用于二进制级别代码重用的标准。就个人而言,我认为这是一项令人着迷的技术。 - smwikipedia

5

你看过IKVM吗?

(意思是询问对方是否了解IKVM)

1
我正在寻找Java调用.Net方法的方式。 - Eduardo Santa
2
你可以通过IKVM来运行Java代码,这就是重点。如果你真的想要运行一个“正常”的JVM,请看看Eclipse项目以及他们如何集成WPF——我相信那里有一个JVM和CLR在同一个进程中运行。不过这可能会非常混乱。 - Jon Skeet

3

您是否了解过Java Native Interface(JNI)?

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

如果您只想公开几个方法,那么JNI可能会很好地工作,但是如果您想公开整个.NET框架,由于需要创建大量的头文件和包装器方法,它可能会变得难以控制。


在JNI上犯错是非常容易的,但这绝对是可行的解决方案。只要JNI定义了一些简单的桥梁,就不会出现太糟糕的情况。 - Mario Ortegón
简单是低估了它的难度!!使用NSIS桥接器,参数以堆栈结构传递(据我所记),我们成功地获得了一些可爱的内存泄漏! - RB.

1

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


1

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

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

ikvmstub mscorlib

这将生成存根mscorlib.jar。(在Linux下,它会自动为我找到Mono mscorlib.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方法,它将打印当前目录中的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接