A volte si può avere la necessità di dover utilizzare delle librerie scritte in Java all’interno di applicazioni .NET.
Le strade possibili sono quattro:
La prima strada richiede l’esecuzione contemporanea di due piattaforme, e non sempre è praticabile.
Le altre due strade sono percorribili solo se la migrazione del codice va fatta una sola volta, per evitare di dover manutenere due basi di codice distinte.
Se però la libreria scritta in Java è in evoluzione, e la si deve utilizzare direttamente è possibile valutare l’ultima soluzione, che è quella che richiede meno interventi sul codice di partenza.
E’ possibile utilizzare due strumenti per convertire un file .CLASS o un file .JAR di Java in un Assembly .NET:
JbImp permette la conversione di librerie Java in Assembly .NET ma supporta solo librerie compatibili con il JDK 1.1.4 e alcune estensioni della versione 1.2. Maggiori informazioni su JbImp possono essere trovate qui.
Attenzione che J# non verrà più sviluppato e l'ultima versione prodotta sarà quella presente in Visual Studio 2005, quindi non conviene investire su questa tecnologia.
IKVM.NET invece è un progetto che ha come obiettivo la creazione di una Java Virtual Machine realizzata in tecnologia .NET, che permette sia l’esecuzione diretta sotto .NET di applicativi Java (al momento limitatamente a librerie e applicazioni console), sia la conversione di file .JAR e .CLASS in Assembly .NET (.exe o .dll) direttamente utilizzabili da Visual Studio facendo Add Reference.
IKVM.NET supporta una versione più aggiornata delle librerie Java e permette la conversione diretta della maggior parte delle librerie. Può essere scaricato da www.ikvm.net (informazioni in lingua inglese).
Il processo di conversione è molto semplice, basta invocare il comando
IKVMC –target:library –out:nomeLibreriaDaGenerare.dll fileJarOClassDaConvertire1 fileJarOClassDaConvertire2 …
È possible utilizzare anche le wildcard * o ? per selezionare più di un file da convertire. Maggiori informazioni sul comando IKVMC possono essere trovate qui (in lingua inglese).
A questo punto basta fare Add Reference della libreria generata all’interno di Visual Studio 2005. Per poter utilizzare la libreria bisogna aggiungere le reference anche alle dll IKVM.Runtime.dll e IKVM.GNU.Classpath.dll.
Bisogna poi ricordarsi che le librerie Java prendono in ingresso i tipi Java, definiti nelle librerie appena importate all’interno dei namespace java.*, ad esempio, se bisogna passare un file ad una libreria Java bisognerà creare un java.io.File, e così via.
IKVM.NET rende semplice la conversione dei tipi, visto System.Object, System.String e System.Exception sono convertite al volo nei corrispondenti tipi Java.
Conviene quindi crearsi un wrapper per chiamare le librerie Java passando degli oggetti .NET, oggetti che verranno poi convertiti all’interno del wrapper nei tipi Java corrispondendi.
L’esempio utilizza la libreria JExcelAPI (informazioni in lingua inglese) per leggere un Workbook contenuto in un file .XLS. Il file jxl.jar è stato convertito con IKVMC in jxl.dll e aggiunto alle reference del progetto.
La libreria è vista da .NET come una serie di classi contenute nel namespace jxl.
Il codice dell’esempio, scritto in C# è stato preso e riportato senza conversione dal codice Java presente nel tutorial in inglese della libreria JExcel, grazie alla similitudine fra i due linguaggi:
using jxl;
...
Workbook workbook = Workbook.getWorkbook(new java.io.File("jxlrwtest.xls"));
Sheet sheet = workbook.getSheet(0);
Cell a1 = sheet.getCell(0, 0);
Cell b2 = sheet.getCell(1, 1);
Cell c2 = sheet.getCell(2, 1);
String stringa1 = a1.getContents();
String stringb2 = b2.getContents();
String stringc2 = c2.getContents();
…
L’unica modifica apportata è stata quella di sostituire le import dei package Java con le using dei namespace di .NET, e l’aver messo java.io.File al posto di File per non confonderla con l’omonima classe .NET.