我不是在寻找像Web服务这样的常规答案。我正在寻找一个轻量级解决方案,可以在同一台机器上运行。
编辑:我正在寻找一种在Java中调用.NET方法的方法。
我不是在寻找像Web服务这样的常规答案。我正在寻找一个轻量级解决方案,可以在同一台机器上运行。
编辑:我正在寻找一种在Java中调用.NET方法的方法。
我相信Java能够与COM进行通信,.NET可以公开COM接口。因此,这可能是一种不需要任何第三方工具的轻量级解决方案。另外还有使用套接字在程序之间进行通信的选项,这不需要在机器上安装重量级的IIS。
你看过IKVM吗?
(意思是询问对方是否了解IKVM)您是否了解过Java Native Interface(JNI)?
我过去的做法是编写一个C库,它可以从Java和.NET(以及COM、NSIS脚本语言和其他技术)中调用。
如果您只想公开几个方法,那么JNI可能会很好地工作,但是如果您想公开整个.NET框架,由于需要创建大量的头文件和包装器方法,它可能会变得难以控制。
我们在生产环境中尝试了IKVM,但它经常崩溃。我们使用JNBridge,这是一个商业产品,但在我们的ASP.NET环境中非常稳定且表现良好。
如果您想在.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.System
而不是仅使用System
。javac -classpath mscorlib.jar IKVMTest.java
由于Java的链接发生在运行时,输出class
文件使用所需名称和签名的方法,但是您可以在使用IKVM运行时将虚拟存根方法替换为真正的.NET方法:
ikvm IKVMTest
通过调用.NET方法,它将打印当前目录中的文件。