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

Était-ce utile?

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]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top