Я думаю, 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]
Это длинный выстрел, так как подмигнули старый вопрос, но это, кажется, именно то, что мне нужно. Мне просто интересно, как вы можете использовать материал CSharpLibrary в классе Java? А что в cshardassembly.dll? – JaapM