我不是在寻找像Web服务这样的常见答案。我正在寻找一种可以在同一台机器上运行的轻型解决方案。
编辑:我正在寻找Java中调用.NET方法的方法
答案 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方法打印当前目录中的文件。