IKVM C # a Java interoperabilità con callback utilizzando IKVM
-
30-09-2019 - |
Domanda
ho iniziato ad usare IKVM a tradurre librerie Java in .NET CIL. Posso scrivere con successo un programma C # che tira dentro (inproc) un Java tradotto assemblaggio da riferimento ed effettuare chiamate al codice Java tradotto.
La mia domanda è, è chiunque w familiare / come effettuare chiamate (callback) da Java a C # usando IKVM? Sono stato alla ricerca di un buon tutorial o spiegazione, ma non ho ancora visto uno.
Ogni aiuto è apprezzato. Grazie,
mj
Soluzione
Signore e Signori, ho capito la mia domanda. Codice primo seguito da passi.
Java Class
public class TestClass {
private cli.CSharpLibrary.Library m_lib = null;
public void AddDelegate( cli.CSharpLibrary.Library lib )
{
m_lib = lib;
}
public void FireDelegate()
{
if( m_lib != null )
{
m_lib.ExecuteRunnableDelegate();
}
}
public void PrintInt()
{
System.out.print(23);
}
}
C # classe
using ikvm.runtime;
using CSharpLibrary;
namespace CSharp
{
class Program
{
public static void DelegateTarget()
{
Console.WriteLine("DelegateTarget Executed!");
}
static void Main(string[] args)
{
Library lib = new Library();
lib.m_runnableDelegate = new Delegates.RunnableDelegate(DelegateTarget);
TestClass tc = new TestClass();
tc.AddDelegate(lib);
tc.FireDelegate();
}
}
}
1) la vostra applicazione Java
2) Convertire i file vostro * .class in un file JAR (jar -cf myjar.jar * .class)
3) Convertire il file jar in un .NET assembly (ikvmc -Referenza: csharpassembly.dll myjar.jar)
Il lavoro dovrebbe a questo punto. È possibile eseguire il programma C #, lo avete chiamare il programma Java e viceversa convertito. Attenzione per la bandiera "-Referenza" sulla chiamata ikvmc. Questo dice IKVM quando è la conversione del codice Java che csharpassembly.dll ha alcune definizioni di classe che ha bisogno di attenzione.
Altri suggerimenti
JaapM, penso CSharpLibrary in soluzione di mj_ è una classe transitoria dalla terza C # progetto DLL (cshardassembly.dll), che lui compila prima e poi azioni tra java reale e codice C #. Non importa ciò che è in esso, l'idea è che entrambe le parti hanno un pezzo di codice (classe), noto in anticipo. Questo è eccessivo, se sono corrette.
Lo so, è un lungo periodo di tempo passato, ma vorrei inviare una breve soluzione qui che funziona per me, perchè ho sprecato troppo tempo su di esso e la documentazione IKVM è molto povero:
Java:
package what.ever.package;
import cli.System.Delegate;
import cli.System.Int32;
public class SomeJavaClass
{
public static void setCallback(Delegate callback)
{
// I call delegate in static setter to keep example short,
// but you may save it and call later...
Int32 result = (Int32)callback.DynamicInvoke("hello", "world");
System.out.println("Callback returned [" + result + "]");
}
}
Non dimenticare di convertire mscorlib.dll in vaso e collegarlo al vostro progetto Java per sostenere le importazioni CLI. costruire ed eseguire ikvmc.exe sul vaso con -target: parametro biblioteca e aggiungere conseguente DLL in C # progetto.
C #:
using what.ever.package
class Program
{
// signature of delegate must match target function.
public delegate Int32 TheDelegateItself(String a, String b);
// callback that we pass into java.
public static Int32 DelegateTarget(String a, String b)
{
Console.WriteLine("DelegateTarget Executed: [" + a + ", " + b + "]!");
return 42;
}
static void Main(string[] args)
{
// again, static call to keep it short
// but you may want a class instance in most cases.
SomeJavaClass.setCallback(new TheDelegateItself(DelegateTarget));
}
}
uscita:
DelegateTarget Eseguito:! [Ciao, mondo]
Richiamata restituito [42]