mercoledì 16 aprile 2014

IKVM

Recentemente ho dovuto usare IKVM, una Virtual Machine Java implementata in .Net.
Devo dire che sono partito un po' prevenuto, perché la commistione tra i due mondi mi sembrava strana, ma devo dire che alla fine l'idea mi ha conquistato.
In pratica IKVM permette di creare assembly o eseguibili a partire da jar, e gli rende quindi fruibili da applicazioni .Net.
Dopo aver realizzato il jar basta chiamare ikvmc.exe, con gli appositi parametri, per avere un assembly (parametro -target:library) oppure un eseguibile (parametro -target:exe).
Ciò a cui si deve prestare particolare attenzione è il Class Loading, perché le due V.M. lo gestiscono in modo diverso e ci possono essere incompatibilità.
Nel mio caso, ad esempio, non venivano caricate in maniera corretta alcune risorse contenute nella library: ho dovuto forzare il caricamento della library, pur usandola alla riga successiva. L'ho fatto attraverso il comando

ikvm.runtime.Startup.addBootClassPathAssemby(Assembly.Load(""));

Altra cosa che mi è successa, e a cui non sono stato capace di porre rimedio, è l'impossibilità di chiamare le classi da un oggetto Com fatto in .Net. Questo perchè Com che chiama .Net che istanzia Java genera una StackOverflowException, eccezione generata a livello di Framework, e quindi non trappabile... chiunque abbia notizie sulla fattibilità della cosa mi faccia sapere.