星期四, 12月 04, 2014

在.Net呼叫Java Library

最近要Support某個案子,因為廠商提供的程式是Jar,而敝公司都使用.Net,所以我找了不少 Decompiler與Java to C#的工具希望能轉成C# code,但因為原始程式經過Obfuscator,轉出都失敗。
後來我換個角度想,如果不要求硬轉成C#,而是讓.Net呼叫Java呢? 看了 Qing (王建興)在2006年的IKVM.NET 深入敵營的 Java深入敵營的Java Part I,才發現我把事情搞得太複雜,現在的IKVM.NET改為使用OpenJDK 7,所以相容性更好,效率高。

簡單來說,原本若只是要執行Java程式,是 java -jar TestIKVM.jar ,現在可以用 ikvm -jar TestIKVM.jar 即可。若是class檔,可以用 ikvm TestIKVM 執行。若要產生exe 就要用 ikvmc  -target:exe TestIKVM.class ,但是執行 TestIKVM.exe時會遇到問題,是因為找不到OpenJDK相關dll,把IKVM.Net的相關dll複製到 TestIKVM.exe的目錄下就可以正常執行。(不要問我需要哪幾個,若你不要全copy只能請你依照錯誤訊息自己一個個加進去)

若使用JDK 8做出來的 class 會無法使用,因為 IKVM.NET  目前版本使用 OpenJDK 7,所以在編譯時要用 javac -target 1.7 -source 1.7 TestIKVM.java 。

但我希望做成dll 整合在自家的程式裡,所以要用 ikvmc -target:library mylib.jar 做出mylib.dll。但是有很多 Jar 時,可以把每個Jar都轉成 dll 放在目錄下或是包成一大個 Jar再去轉換。

轉換出來的dll,基本上就可以使用,但是在專案用時,必須包含 IKVM.NET 所提供的OpenJDK dll,IKVM.Runtime、IKVM.OpenJDK.Core等等,必須放在同個目錄下,只加入Path仍然無法執行。

什麼?不是自己寫的程式不知道有什麼API可用?嗯...可以試看看免費的dotPeekILSpy,若還不會我也救不了你。

沒有留言: