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]