2010-11-10 2 views
2

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

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

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

MJ

ответ

3

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

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# класс

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 файлы в банку файл (банку -cf myjar. jar * .class)

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

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

+1

Это длинный выстрел, так как подмигнули старый вопрос, но это, кажется, именно то, что мне нужно. Мне просто интересно, как вы можете использовать материал CSharpLibrary в классе Java? А что в cshardassembly.dll? – JaapM

0

Я думаю, 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 на банке с параметром -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]

Смежные вопросы