在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发。目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个主要阵营,所以Java.和Net之间的整合是大型应用开发过程中经常会面临一个问题。

目前Java和.Net之间的整合主要有三种思路和做法(经过几天的查阅,目前我就看到了这三种方式,可能还有其他的方法):

1)基于通讯协议的整合

基于通讯协议的整合方式,最容易被人首先想到,简单的方式可以通过Web Service来实现,但是效率问题,在某些场合之下将会成为一个致命伤。使用Remote进行分布式开发,可以提高通信的效率,好消息是:Java和.Net都很好的支持Remoting远程对象调用的分布式开发;坏消息是:他们同时存在一个弊端,那就是对开发语言的限制,无论是使用哪一种通讯方式,服务器与客户端都必须支持同一种开发语言。对此,各大开发公司做出了积极的贡献,开发出如J-Integra(又名Ja.NET),IIOP.NET(Internet Inter-Orb Protocol),JNBridge等集成开发工具,对.NET与JAVA之间实现Remote远程对象的相互调用作出足够的支持。在这些产品中推荐选用:JNBridge

JNBridge是一种领先的JAVA与.NET互操作的的产品,凭借JNBridge技术,Java和.NET代码无需交叉编译器就可以实现对象共享。所有Java代码运行在JVM上,而.NET代码则运行在CLR上。在该方案下,JVM和CLR可以运行在不同的机器上,也可以运行在一台机器的不同进程上,甚至还能运行在相同的进程的不同应用程序域上。经历多年的发展,JNBridge已经发布了JNBridgePro 5.0,JNBridgePro 5.0有着更强大的功能。

1.支持ava和.NET之间的跨平台事务;
2.支持Microsoft Visual Studio和Eclipse插件;
3.兼容Windows 7;
4.跨平台交易一体化主要是对用户透明;
5.'回滚'- 任何一方的终止都将导致双方的行动被回滚;

JNBridge支持.NET To Java ,Java To .NET两种服务方式,并可以行用TCP、HTTP、SOAP等多个协议进行双方通讯。

参考资源:

官网地址:

http://www.jnbridge.com

2)基于用.Net实现Java虚机的整合

  目前可以选用的开源资源主要是:IKVM.NET。

  IKVM.NET的是开源的基于.NET CLR 的Java虚拟机。基于.NET的Java虚拟机意味着我们可以让Java程序跑在.NET上,可以通过虚拟机这个中介让Java程序和.NET应用程序一起协同工作。更难能可贵的是,IKVM同时支持微软的.NET Framework 和 Mono。

安全性是IKVM平台的一个大遗漏。此问题将依靠.NET平台提供的旧有的、但功能强大的安全模式而被解决。 虽然这样,目前项目已具备能成功运行大型java项目的能力。

  IKVM目前不成熟的地方在以下几个方面:   

1.对AWT和Swing没有提供支持,在IKVM的开发计划中,这项优先级别不高。   

2.对Java的安全模型没有实现。

参考资源:

《Using Java Classes in your .NET Application》

http://www.codeproject.com/Articles/13549/Using-Java-Classes-in-your-NET-Application

3)基于java的本地接口的整合
      Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库可以是其它语言编写的,比如C、C++或者汇编语言。

参考资源:

《Using the Java Native Interface in C#》

http://www.codeproject.com/Articles/245622/Using-the-Java-Native-Interface-in-Csharp

综述

  选用JNBride,比较适合大型项目的开发,在双方互调上支持的非常好,而且双方可以互相不用感知。但是不管怎么样,信息传输上需要一定的开销(如果对于效率要求非常高的情况下,这方面多少有些损失)。

  选用IKVM.NET,在.Net调用Java上可以做到“无缝”,如果不考虑Java调.Net(好像Java调用.Net的Dll没有.Net Call Java那么麻烦),个人感觉一般情况下还是首选(毕竟它目前的不足,一般的情况下影响不是太大,也很少有机会涉及到)。

  基于JNI的整合方式,由于对Java不太了解,不好过多评论,不过曾看到一句这样的描述:使用本地方法是有开销的,它丧失了java的很多好处。如果别无选择,我们可以选择使用本地方法。不管怎么样,从别人文章的描诉:“In my example, I will show you how to call a couple of Java methods from a C# client.”,可以看出从实现上,完全可以做到.Net调用Java方法。

  以上的综述,均为个人浅显的理解,这几天仅仅从全局上考虑如何“Call Java Method From .Net”,对于这三种方式的Demo并没有按照别人的介绍去调试和性能测试,仅仅先从大的方向和思路上做一些前期研究。下一步,打算把1,2种方式的Demo进一步研究和比较一下,第3种方式,目前暂时定性位了解吧。

[OpenSource]浅谈.Net和Java互相调用的三种方式的更多相关文章

  1. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  2. 【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  3. 如何实现有返回值的多线程 JAVA多线程实现的三种方式

    可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...

  4. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

  5. Java实现线程的三种方式和区别

    Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...

  6. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  7. SpringBoot2.0.2 Application调用的三种方式

    一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfigurati ...

  8. java创建线程的三种方式及其对比

    第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务.第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务.第三种方法:实现c ...

  9. Struts2方法调用的三种方式(有新的!调用方法的说明)

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...

随机推荐

  1. install xdebug on fedora

    Compiling There is a wizard available that provides you with the correct file to download, and which ...

  2. CSS 之 @media

    @media 版本:CSS2 兼容性:IE5+ 语法: @media  sMedia  {sRules} 取值: sMedia : 指定设备名称.请参阅设备类型 all, aural, braille ...

  3. 《C和指针》读书笔记——第一章 快速上手

    1.注释代码可以用: #if 0 statements #endif 2.参数被声明为const,表明函数将不会修改函数调用者的所传递的这个参数. 3.scanf("%d",&am ...

  4. 关于LookAt

    Transform.LookAt 注视 function LookAt (target : Transform, worldUp : Vector3 = Vector3.up) : void 旋转物体 ...

  5. poj 2440 (找递推公式)

    http://poj.org/problem?id=2440 DNA Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3254 ...

  6. mysql 自定义排序顺序

    mysql 自定义排序顺序 实例如:在sql语句中加入ORDER BY FIELD(status,3,4,0,2,1)语句可定义排序顺序 SELECT tsdvoucher0_.VOUCHER_ID ...

  7. oracle----修改表中的数据

    1. 修改表中的数据:UPDATE语句: 语法: UPDTAE table_name SET column1 = value1,... [WHERE conditions] (2),无条件的更新(没有 ...

  8. BZOJ 3992 [SDOI 2015] 序列统计 解题报告

    这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...

  9. Ubuntu下使用ap-hotspot出现“Another process is already running"问题的解决方案

    参考Problem with ap-hotspot 问题描述: This is the message displayed in my terminal screen when I typed sud ...

  10. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...