我有两个程序。一个是C#,另一个是Java。 这些程序很可能总是在同一台机器上运行。
让他们互相交谈的最佳方式是什么?
所以,澄清问题:
这是一个个人项目(所以专业/昂贵的图书馆是不行的)。 消息量很低,每秒大约有1到2条消息。 消息很小,一些原始类型应该可以解决问题。 我想保持低复杂性。 java应用程序作为单个jar部署,作为另一个应用程序的插件。所以我必须合并的外部库越少越好。 我完全可以控制C#应用程序。 如前所述,两个应用程序都必须在同一台计算机上运行。 现在,我的解决方案是使用类似csv格式的套接字。
答案 0 :(得分:18)
我是jni4net的作者,JVM和CLR之间的开源进程间桥接。它建立在JNI和PInvoke之上。不需要C / C ++代码。我希望它会对你有所帮助。
答案 1 :(得分:9)
Kyle在询问互动方面有正确的方法。如果不知道使用模式可能是什么,就没有“正确”的答案。
任何架构决策 - 特别是在这个级别 - 是一种权衡。
你必须问问自己:
在您对这些问题的答案或潜在答案有所了解之前,很难选择实施架构。一旦我们知道哪些因素很重要,就可以更容易地选择更合适的实施候选项来反映运行系统的要求。
答案 2 :(得分:7)
我听说过有关IKVM的好东西,这是用.NET制作的JVM。
答案 3 :(得分:4)
Ice是一个非常高性能的“企业级”互操作层,支持Java和.net等。我认为它是一个更新的Corba - 它甚至有自己的面向对象的接口定义语言Slice(就像Corba的IDL,但实际上相当可读)。
功能集非常广泛,提供的功能远远多于Web服务,但显然它不是一个开放标准,因此不能轻易做出决定。它吐出的生成代码也有些难看......
答案 4 :(得分:3)
我在一个相对简单的项目中使用了JNBridge(http://www.jnbridge.com/jnbpro.htm),我们有一个.NET客户端应用程序,它使用了一个相对重要的jar文件,其中包含我们不想移植的业务对象逻辑。它运作得很好,但我不会说我们已经完全运用了JNBridge的功能。
答案 5 :(得分:3)
我意识到你在谈论同一台机器上的程序,但我一直都喜欢用HTTP传递消息的想法。
您的服务器可能是准备接受XML有效负载的Web服务器。您的客户端可以在正文中发送带有XML的HTTP消息,并在其中接收带有XML的HTTP响应。
我喜欢这个的一个原因是HTTP是一种广泛使用的协议,它很容易接受或以任何语言创建HTTP POST或GET请求(如果您决定在将来更改客户端或服务器语言)。 HTTP和XML已经存在了一段时间,所以我认为它们会留下来。
我喜欢它的另一个原因是,只要他们知道HTTP和XML,您的服务器也可以被其他客户端使用。
答案 6 :(得分:1)
我是Facebook Thrift互操作性堆栈的忠实粉丝。你说他们的代码可能会在同一台机器上运行,所以它可能有点矫枉过正,但你仍然可以使用它。
答案 7 :(得分:0)
如果它们是独立的程序并作为独立的应用程序运行,则可以使用套接字。我知道定义通信协议有点复杂,但它非常简单。
但是,如果您只有两个单独的程序但希望将它们作为单个应用程序运行,那么我认为IKVM是一种更好的方法,正如marxidad所建议的那样。
答案 8 :(得分:0)
在此之前,有一个非常类似的问题已经被问到堆栈溢出(我在Google上搜索java windows共享内存):
Efficient data transfer from Java to C++ on windows
从答案我建议你去调查:
“你最快的解决方案就是记忆 映射共享的内存段, 他们实现了一个环形缓冲区或 其他消息传递机制。在 C ++这是直截了当的 Java你有FileChannel.map 使它成为可能的方法。“