跳到主要內容

在.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,若還不會我也救不了你。

留言

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?