zoukankan      html  css  js  c++  java
  • 把Java项目的代码转换为C#代码

         由于项目要求,最近需要把一个项目是Java开发的代码,转换成C#的代码,一个文件一个文件对应转换,肯定比较耗时,利用工具加自己的经验,可以事半功倍,下面讲下我转换的过程。

             这次要转换的代码是IBE客户端。IBE提供给外界的连接方式有两种:1Java2ComJava版的一般用于java客户端,Com版一般用于windows平台下.net开发。我们平台用的是Com版的客户端,通过平台性能测试,发现Com版性能不是很好,和IBE组同事沟通后,说Com版本来也打算改造,内部程序结构比如存在不允许有重复函数名称,托管代码和Com组件转换可能降低效率等,能模仿JAVA调用方式,实现.NET调用的代码,他们也非常支持。本文以把Java版的IBE客户端转换为C#版客户端的过程,介绍了一般从Java代码转换到C#代码的实现思路。

             为了不展现IBE的源码,本文尽量只介绍转换过程的工具和思路。

    工具介绍:

             转换过程中用到了Eclipse的插件:j2cstranslator,项目地址在http://sourceforge.net/projects/j2cstranslator/ ,但能找到的最近插件下载地址在:http://sourceforge.jp/projects/sfnet_j2cstranslator/releases/,下载最新的插件com.ilog.rules.Java2CSharpTranslator_1.3.6.20110519_01.jar,有1.2M。通过插件可以方便的从Eclipse下把代码转换成C#代码,但为了让转换后的C#代码正常运行,还需要j2cstranslator插件官方提供的映射文件J2CSMapping,它的作用是让java的一些特性和c#的特性关联起来,正常编译并运行。对应的有.net2.03.54.0等不同映射文件。映射文件只有一个ILOG.J2CsMapping.dll

             但是用插件配套提供的映射.net文件,在VS下编译仍然有一些错误无法编译,经过大量尝试,我找到了另外一个.net开源工具:IKVM.NET,官方地址:http://www.ikvm.net/ IKVM内部实现了用.net写的JAVA虚拟机功能,并且包括从Jar包直接转换为dll的命令行工具,以及java.net之间互相调用的环境支持。IKVM提供了30dll文件以及3exe文件。IKVM的一些调用和转换方式可以网上搜索下其他资源,我在转换后的项目中只引用了IKVM.OpenJDK.Core.dll文件就能编译通过,但最后运行时依靠IKVM的其他dll文件才运行正常。

    转换为生产可用代码:

             实际在转换IBE代码过程中,引用了ILOG.J2CsMapping.dllIKVM.OpenJDK.Core.dll以及其他IKVMdll后还是会有一些报错,比如java里用的super.net里用的base调用基类等等问题,需要手工修改。Java中的socket处理方式和.net也不一样,需要手工修改代码。

             要想在生产上使用,肯定不能依赖太多外部dll,虽然IKVM是开源的,但内部会有一些非托管的c++代码。到生产上使用,肯定要尽量少的依赖外部DLL,用.NET自身框架的代码实现JAVA的实现方式,这块就要根据实际情况灵活处理了,我在转换IBE过程中,发现大多是socketCalendar的转换工作,经过不断调试和分析,终于替换掉了这些代码的转换。当然根据不同JAVA项目,可能需要转换的对象和处理方式不一样,需要对症下药了。

    转换过程:

             装好Eclipse的插件后,打开JAVAIBE源码,然后选择EclipseFile->Export…,如图一:

    图一

    导出页面Other里多了一个ILOG Java to CSharp Translator选项,一路选择Next,后面有选择转换后的生成目录。转换后是没有csproj的项目文件,全部是.NET的源代码.cs文件。

             然后新建.NET的解决方案,再新建一个.NET的项目,把转换后的文件包含到解决方案里。项目引用ILOG.J2CsMapping.dllIKVM.OpenJDK.Core.dll文件,然后编译。这时可能还会出现很多错误,因为任何工具都不是万能的,尤其是对编程语言的互相转换,还需要手工进行一定的修改。

             最后根据不同类型特性,再把依赖于外部的API方法手工切换到.NET自身框架提供的API,由于涉及代码保密,就不举例了。

     

    总结:

             本篇文章主要介绍了转换的思路,涉及很具体的代码转换很少介绍。授人以鱼不如授人以渔,这篇文章对我自己以后相关工作也有非常大的帮助。

  • 相关阅读:
    mysql timeout expired处理
    Git学习笔记(0)-错误汇总
    auto_ptr源码剖析
    谈谈工作中遇到的系统优化问题
    js 面向对象
    js API
    js 闭包
    js 重载(overload)
    css 文本单行、多行超出省略
    es6 字符串String的扩展
  • 原文地址:https://www.cnblogs.com/Lawson/p/2361827.html
Copyright © 2011-2022 走看看