IKVM C # для взаимодействия с Java с обратным вызовом с использованием IKVM - PullRequest
3 голосов
/ 10 ноября 2010

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

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

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

MJ

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

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

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

C # Class

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 имеет некоторые определения классов, на которые он должен обратить внимание.

0 голосов
/ 12 февраля 2016

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

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

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

Не забудьте конвертировать 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 Выполнено: [привет, мир]!
Обратный звонок возвращен [42]

...