Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
独立于平台的Java<-&燃气轮机;C#互操作性_Java_C#_Language Interoperability - Fatal编程技术网

独立于平台的Java<-&燃气轮机;C#互操作性

独立于平台的Java<-&燃气轮机;C#互操作性,java,c#,language-interoperability,Java,C#,Language Interoperability,我们希望在Java项目中使用现有的C#源代码。到目前为止,这不是一个大问题,因为使用Java本机接口(JNI)是非常直接的。 问题是,该软件也应在非windows操作系统上运行。因此,我们可以使用Mono编译C#源代码,使其在Linux等平台上可执行。但是Java内部的集成呢?JNI或任何基于COM的C#Java互操作性解决方案都依赖于操作系统,仅在Windows上工作 一个可能的解决方案是实现webservices。有人知道如何解决这个问题吗?我将非常感谢其他建议 非常感谢 关于这可能不是一个

我们希望在Java项目中使用现有的C#源代码。到目前为止,这不是一个大问题,因为使用Java本机接口(JNI)是非常直接的。 问题是,该软件也应在非windows操作系统上运行。因此,我们可以使用Mono编译C#源代码,使其在Linux等平台上可执行。但是Java内部的集成呢?JNI或任何基于COM的C#Java互操作性解决方案都依赖于操作系统,仅在Windows上工作

一个可能的解决方案是实现webservices。有人知道如何解决这个问题吗?我将非常感谢其他建议

非常感谢

关于

这可能不是一个“答案”,更多的是关于我如何看待类似(我认为)情况的讨论

我在一个基于C#/.Net的客户机-服务器风格的系统上投入了大量资金。所以,当我决定我也想支持Android“客户端”应用程序时,我考虑了各种选择。对我来说,最重要的因素是保持我的C#类作为现有系统和即将编写的Java Android应用程序之间对象交换的定义类

我最终决定,并根据我的喜好调整,是一个系统,其中谷歌协议缓冲区是交换媒体。(如果您不熟悉它们,它们是一种类似JSON的交换格式。)

在.Net端,我使用Marc Gravell编写的ProtoBuf Net(我相信他在SO工作)。它包括获取.Net对象和生成.proto文件(协议缓冲区的定义文件)的能力。

在Android端,我使用David Yu编写的原型。他的代码中有一部分接受.proto文件并生成相应的Java类。

我遇到的一个问题是,对于大多数派生类的.Net类来说,这种方法不太管用。我创建了一个变通方法,在我对此处答案的评论中进行了描述:

我现在对这项工作感到满意

请注意,我根本没有谈到Android应用程序如何连接到基于Windows的系统以及如何执行通信。这对我来说是次要的——我主要考虑的是将C#类定义作为最终定义,并自动创建Java类,然后进行对象到对象的交换。(在这种情况下,我使用的是自制的TCP/IP通信链路,但实际的通信可能是任何东西,也可能是web服务。)


希望这能有所帮助。

因此,我在这个主题上做了大量研究,并想与大家分享我的发现:

一个(从技术角度来看非常有吸引力)选择是在Java和.Net之间使用商业桥梁。当然,最受欢迎的产品是和。这两种产品似乎都非常易于使用,具有良好的支持,并且似乎非常复杂。特别是JNBridge已经支持Java和Mono之间的桥接,这也允许移植到非Windows操作系统,这是我们上面提到的主要需求之一。Javonet还希望集成Mono,并将很快发布此功能。然而,这两种解决方案都是商业性的,需要根据各自的成本权衡它们的功能。然而,从纯技术的角度来看,它们看起来很棒,并且能够在Java和.Net之间实现非常快速的通信(比使用web服务更快)

另一种选择是通过COM连接Java和.NET。由于COM通常是独立于平台定义的,因此可以在多个操作系统上工作。有很多开源项目可以用于这样的实现,比如EZJCOM、J-Interop、JACOB或JCOM。主要的限制(特别是对于我们的项目)是Mono只支持Windows下的COM互操作性。所以,这对我们来说不是一个真正的选择。但是,如果您只想在Windows上创建Java-.NET互操作性,这是一个好方法

集成Java和C的最先进的方法是使用Java本机接口(JNI)。您还可以找到使JNI更易于使用的多种实现,最流行的可能是它似乎是一个非常活跃且经常使用的项目。但也有其他一些有具体利弊的,如咖啡因、浓缩咖啡或csjni。最后,JNI不是100%独立于平台的。它适用于不同的平台,但您必须生成特定于平台的代码,这显然会降低它对我们的用途的可用性。如果您将应用程序限制在Windows上,jni4net似乎是一个非常好的选择

第三种选择是在公共语言运行库中同时运行Java和.Net部分。因此,这是一种可能且非常流行的解决方案(如上文Samuel Audet所述)。此选项的缺点是失去了JDK的功能和效率

最后一个也是最通用的选择是在Java和.Net世界之间建立Web服务。对于这个解决方案,需要找到合适的方法从Java和.Net序列化/反序列化对象。这方面有多种可能的解决方案。RenniePet提到了一个基于协议缓冲区的复杂解决方案。其他的也存在,例如。在考虑通信运行时时,此选项可能有一个潜在的缺点,但对我们来说可能是一种方法


希望这可以帮助将来遇到同样问题的任何人。

这必须紧密结合在一起吗?我有一个用C#编写的基于Windows的系统,它与一个用Java编写的Android应用程序对话,使用Google协议缓冲区进行对象交换。如果有兴趣的话,我可以解释更多。没有关于气密性的要求。。。如果我们用webservices来实现它,我们将有两个独立的应用程序:-)。你的解决方案听起来不错。。。是否有使用协议缓冲区的参考实现