IKVM C # Java Interop avec rappel à l'aide IKVM
-
30-09-2019 - |
Question
J'ai commencé à utiliser IKVM pour traduire Java libs dans .NET CIL. Je peux écrire avec succès un programme C # qui tractions dans (inproc) un ensemble Java traduit par un appel de référence et apporter au code Java traduit.
Ma question est, est une personne familière avec / comment faire des appels (callbacks) de Java à C # en utilisant IKVM? Je cherchais un bon tutoriel ou une explication, mais ne l'ai pas encore vu une.
Toute aide est appréciée. Merci,
mj
La solution
Mesdames et Messieurs, je me suis ma propre question. Code premier suivi par étapes.
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);
}
}
classe C #
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) votre application Java
2) Convertissez vos fichiers de * dans un fichier jar (pot -cf myjar.jar * .class)
3) Convertir le fichier jar dans un ensemble .NET (ikvmc -Référence: csharpassembly.dll myjar.jar)
Le travail devrait à ce stade. Vous pouvez exécuter votre programme C #, il faut appeler le programme Java converti et vice-versa. Attention pour le drapeau « de référence » sur l'appel ikvmc. Cela dit IKVM quand il est la conversion du code Java qui csharpassembly.dll a quelques définitions de classe dont il a besoin pour surveiller.
Autres conseils
JaapM, je pense que CSharpLibrary dans la solution de MJ_ est une classe transitoire du troisième projet C # DLL (cshardassembly.dll), qu'il compile d'abord, puis entre actions java réelle et le code C #. Peu importe ce qui est en elle, l'idée est que les deux parties ont un morceau de code (classe) connue à l'avance. C'est surpuissant, si je ne me trompe pas.
Je sais, il est longtemps passé mais je voudrais ajouter une solution à court ici qui fonctionne pour moi, parce que je perdu trop de temps et la documentation IKVM est très pauvre:
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 + "]");
}
}
Ne pas oublier de convertir mscorlib.dll en pot et attacher à votre projet java pour soutenir les importations cli. construire et exécuter ikvmc.exe sur bocal avec -target: paramètre bibliothèque et ajouter résultant DLL dans le projet C #.
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));
}
}
sortie:
DelegateTarget Exécuté: [bonjour, monde]
Callback retourné [42]