把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,由於涉及代碼保密,就不舉例了。

 

總結:

         本篇文章主要介紹了轉換的思路,涉及很具體的代碼轉換很少介紹。授人以魚不如授人以漁,這篇文章對我自己以后相關工作也有非常大的幫助。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM