如何从Java调用.NET代码?

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

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

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

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

你看过IKVM了吗?

你看过Java Native Interface吗?

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

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

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

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

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

 ikvmstub mscorlib 

它生成stub 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. 因此导入cli.System而不仅仅是System

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

 javac -classpath mscorlib.jar IKVMTest.java 

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

 ikvm IKVMTest 

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