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