程式者的胡言亂語
深入敵營的Java Part II
在上述視窗的命令列中,我輸入的是:
\ikvm-
其中\ikvm-
接著,我在命令列輸入searchfiles,代表要執行SearchFiles.exe,我分別輸入” tautology”、”reduplication”,以及”either”三個字進行全文的查詢。而它所查詢的,正是適才執行的Java程式所建立的索引檔。SearchFiles.exe原先是lucene-demos-
所以,何必這麼辛苦呢?Java真的是一次編寫,隨處運行呀,用Java版的Lucene不就成了。稍後,我會在C#程式中直接使用這裡所轉換得到的lucene.dll,這暗示或明示了.NET程式包括ASP.NET或VB.NET,都可以直接使用Java世界的Lucene,毋需任何額外的移植心力。
IKVM.NET的作者
看到了IKVM.NET的簡單火力展示,相信多少會有點心動了吧。這一切都要感謝IKVM.NET的作者Jeroen Frijters,以及其開發團隊的貢獻。Jeroen Frijters(jeroen@frijters.net)保持了一個好習慣,也就是利用他的blog(http://weblog.ikvm.net/),記錄他開發IKVM.NET的點點滴滴,包括對技術觀點的思考以及心路歷程。倘若一路追溯其blog上的文章,也能循原路一路追蹤IKVM.NET的發展歷史。

Jeroen Frijters
下載,安裝,及設定
那麼,要如何取得IKVM.NET呢?IKVM.NET已經是SourceForge上的一個專案。只要到這個網址,即可很容易的找到下載處。
http://sourceforge.net/projects/ikvm/
下載.zip檔,並且將它解開至某個目錄(例如c:\ ikvm-
但由於IKVM.NET執行時會需要一些.DLL,這麼一來,在不同目錄執行IKVM.NET時,得將這些.DLL複製的到處都是。如果想偷懶或避免麻煩的話,可以將相關的DLL安裝於Global Assembly Cache中。這會使得.NET平台無論在任何目錄執行,都能找到這些.DLL。怎麼將安裝DLL安裝於Global Assembly Cache中呢?在Windows上,請從「控制台」出發,選擇 [系統管理工具]/[Microsoft .NET Framework 1.1組態],再從樹狀檢視中選擇[我的電腦]/[組件快取],即可輕易的將DLL加入Global Assembly Cache。那麼,要加入那些DLL呢?最少你得將IKVM.GNU.Classpath.dll及IKVM.Runtime.dll加入,這兩個DLL及其餘DLL的用途,我接著馬上說明。
重要組成
在IKVM.NET的bin目錄下,可以看到有數個DLL以及EXE檔,它們都是IKVM.NET的重要組成,包括:
l IKVM.Runtime.dll
l IKVM.GNU.Classpath.dll
l IKVM.JNI.CLR-Win32.dll
l IKVM.AWT.WinForms.dll
l ikvm.exe
l ikvmc.exe
l ikvmstub.exe
IKVM.Runtime.dll提供了IKVM.NET本身VM的runtime所需以及其他輔助程式碼,例如Byte Code JIT compiler/verifier、Object model remapping infrastructure、以及針對GNU Classpath中的原生部份所撰寫的.NET實作。
而IKVM.GNU.Classpath.dll便是GNU Classpath的已編譯版本,你可以把它視為.NET版本的Java核心程式庫。IKVM.JNI.CLR-Win32.dll是實作JNI介面的Managed C++ assembly,它並非執行IKVM.NET的必需品,倘若你執行的是純Java應用程式,沒有動用到JNI,那麼就不需要動用到它。事實上,IKVM.NET還提供另一個名為IKVM.JNI.Mono.dll的檔案,它與IKVM.JNI.CLR-Win32.dll的作用是相當的,只不過IKVM.JNI.Mono.dll是提供Mono平台上的IKVM.NET使用。IKVM.AWT.WinForms.dll是IKVM.NET的AWT peers實作。由於作者認為這一塊(AWT/SWING)對他本人來說是優先序較低的一塊,所以他自己也承認目前的實作情況並不佳。
IKVM.NET提供了三個執行檔。ikvm.exe是IKVM.NET的VM啟動程式,相當於我們在JDK或JRE中十分熟悉的java.exe,作用相同,也就是啟動JVM,並且執行所指定類別的main()。當我們使用動態的應用模式時,便會使用到ikvm.exe。
ikvmc.exe這個工具則是用來將.class或.jar檔編譯成為.NET assembly,這裡所指涉的.NET assembly包括:EXE檔(作為console 或視窗應用程式),DLL檔(作為library),以及.netmodule(做為.NET上的模組)。在靜態應用模式中,便會使用到這一個工具。
ikvmstub.exe則能針對指定的Assembly,產生相對應的jar檔,此jar檔中內含Java版本的interfaces及stub類別。其目的在於為.NET類別提供Java版本的介面(stub類別),以便讓Java應用程式呼叫.NET類別。
如上圖所示,ikvmstub.exe會產生介面和.NET類別一模一樣的Stub類別,而這個Stub類別是Java類別,那麼我們所撰寫的Java類別便可以透過呼叫Stub類別,進而達成呼叫.NET類別的目的。
Posted at 10:47下午 八月 10, 2006 by Chien-Hsing Wang in Java |
星期四 八月 10, 2006
