从WIN32应用程序使用的C#COM DLL调用Java代码?

时间:2009-09-15 19:35:31

标签: c# java delphi

我有一个非常简单的问题。我有一个用Delphi 2007 for WIN32编写的应用程序。它使用一个C#DLL,通过它的COM接口导入到项目中,这是一个简单的技巧,可以避免注册COM对象。但是现在我有一个Java生成的.JAR文件,我想从我的应用程序中调用它。虽然我可以访问Delphi和C#代码,但我只是无法访问Java代码。

我可以做两件事。我可以从Delphi代码中调用Java类,然后从C#代码调用该代码,该代码将再次从Delphi代码中调用。或者我只是直接从C#调用Java代码。 (再次从德尔福调用。)

我知道这是一个复杂的设置。 Delphi应用程序包含一些GUI和一些特殊硬件的通信模块。这些没有.NET驱动程序。 C#代码用于维护数据库通信,包括与CardSpace和其他安全选项相关的一些逻辑。 Java类是第三方编码模块,由外部方创建,它计算数据库中数据的特殊哈希码,并进行一些额外的处理,并控制另一块硬件。

最大问题:没有网络通讯!它将在没有安装网络硬件的特殊计算机上运行。它是一个独立的Windows XP系统。虽然COM,Java和.NET都可以,但我不能在这个系统上使用任何TCP / IP通信。

如果我接受它,那将是我的下一个项目。已经,它让我头疼,所以我想我会跳过这个机会,虽然它确实有几种不同语言的有趣混合。我想我会告诉他们投资6位数来购买新硬件,而不是在我工作的28天内花费近5位数......


关于我可以分享的项目的一些细节:

Delphi代码能够通过COM端口连接到PBX系统,该端口用于发送传真,发送和接收SMS消息以及通过在呼入后通过电话输入数字来接收简单命令。整个系统具有为此编写,全部基于WIN32代码。

Java代码是一个客户端模块,用于与机器人系统进行通信,该系统监视环境,处理一些精密对象并对这些对象进行持续测量。它在Java中,因此它与平台无关。 Java客户端和机器人硬件之间的通信是通过网络完成的,网络硬件/驱动程序不喜欢通过该网络进行额外的聊天。 (这就是为什么它尽可能地被禁用。甚至Windows都不会得到更新。)

C#代码是从Java模块收集数据并实际存储这些内存中的常规备份XML,以防万一发生。它是与Java模块和一些其他模块进行通信,这些模块处理以客户自己开发的.NET兼容域特定语言编写的复杂计算。这些模块不支持COM,因此不支持c#包装器。

客户现在需要操作员靠近硬件来操纵机器人。他可以升级硬件,花费他很多,但它会给他更好的远程访问,花费大约250.000欧元来取代古老的机器人和其他硬件,或者他支付一些开发人员的十分之一,以获得他当前的硬件照着做。就个人而言,我认为他不应该是这样的小气鬼,但他只想估计开发人员的解决方案会花费多少钱。代码更改并不大,因为大多数功能已经存在。它只是在没有任何TCP / IP通信的情况下将它组合在一起,使其更加复杂。

基本上,他们想要提供的指示是加快速度或减慢速度,发送不定期报告以及在出现问题时发送短信警告。现在,他们坐在屏幕旁边,一整天都在喝咖啡,边读报纸或其他杂志。虽然这几天很有趣,但他无法找到想要一直这样做的人,每周7天,每天24小时。 (是的,他们日夜工作,包括周末。)

基本上,这就是我所知道的。甚至没有看到它需要安装的PC,但它们有一些配置都以相同的方式,所以我可以得到一个实验,一旦需要。 (这也是一个地狱调试。)


最后一点,我提出了成本估算,并提出了足够高的数字来说服我的潜在雇主进行硬件升级代替。更昂贵,但它会保持其可靠性。

因此,这个Q刚刚成为学术界......

4 个答案:

答案 0 :(得分:4)

另一种选择是IKVM。它是.NET的Java实现。请查看this related question,这些答案可能对您有帮助。

答案 1 :(得分:2)

JNBridge提供了一个Java-to-.NET桥(反之亦然)。它得到了特别的支持,相对便宜,并且效果很好。它具有低延迟,并且不需要TCP / IP或网络通信。您无需访问Java代码即可通过网桥从.NET调用它。

答案 2 :(得分:1)

无论是否安装了任何网络硬件,独立Windows XP系统都可能仍然具有本地 TCP / IP网络。您可以让程序侦听localhost地址(127.0.0.1)上的TCP端口,并连接其他服务以通过您选择的任何协议交换信息。使用REST的HTTP可能是一个合适的选择。

尝试将所有这些技术整合到一个Franken项目中可能会少得多。

答案 3 :(得分:1)

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