Взаимодействие IKVM C# ​​с Java с обратным вызовом с использованием IKVM

Я начал использовать IKVM для перевода библиотек Java в .NET CIL. Я могу успешно написать программу на C#, которая извлекает (inproc) переведенную сборку Java в качестве эталона и выполняет вызовы переведенного кода Java.

Мой вопрос: кто-нибудь знаком с тем, как совершать вызовы (обратные вызовы) с Java на С# с помощью IKVM? Я искал хороший учебник или объяснение, но еще не видел.

Любая помощь приветствуется. Спасибо,

mj


person mj_    schedule 10.11.2010    source источник


Ответы (2)


Дамы и господа, я сам разобрался со своим вопросом. Сначала код, затем шаги.

Java-класс

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);
}
}

Класс С#

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) Напишите свое Java-приложение

2) Преобразуйте файлы *.class в файл jar (jar -cf myjar.jar *.class)

3) Преобразуйте файл jar в сборку .NET (ikvmc -reference:csharpassembly.dll myjar.jar)

Должен работать в этот момент. Вы можете запустить свою программу C#, вызвать преобразованную программу Java и наоборот. Следите за флагом "-reference" в вызове ikvmc. Это говорит IKVM, когда он конвертирует код Java, что csharpassembly.dll имеет некоторые определения классов, за которыми нужно следить.

person mj_    schedule 10.11.2010
comment
Это длинный выстрел, так как это старый вопрос, но, похоже, это именно то, что мне нужно. Мне просто интересно, как вы можете использовать материал CSharpLibrary в классе Java? А что в cshardassembly.dll? - person JaapM; 05.03.2014

JaapM, я думаю, что CSharpLibrary в решении mj_ - это переходный класс из третьего проекта C# DLL (cshardassembly.dll), который он сначала компилирует, а затем распределяет между фактическим кодом java и C#. Неважно, что в нем, идея в том, что обе стороны имеют кусок кода (класс), известный заранее. Это перебор, если я прав.

Я знаю, прошло много времени, но я хотел бы опубликовать здесь короткое решение, которое работает для меня, потому что я потратил на него слишком много времени, а документация IKVM очень плохая:

Джава:

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 + "]");
    }
}

Не забудьте преобразовать mscorlib.dll в jar и прикрепить его к вашему java-проекту для поддержки импорта cli. создайте его и запустите ikvmc.exe в jar с параметром -target:library и добавьте полученную DLL в проект 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));
    }
}

выход:

DelegateTarget Executed: [hello, world]!
Обратный вызов возвращен [42]

person ApelsetZ    schedule 12.02.2016