IKVM を使用して Java ライブラリを .NET CIL に変換し始めました。翻訳された Java アセンブリを参照として (インプロセスで) 取り込み、翻訳された Java コードを呼び出す C# プログラムを正常に作成できます。
私の質問は、IKVM を使用して Java から C# への呼び出し (コールバック) を行う方法に詳しい人はいますか? 良いチュートリアルや説明を探していましたが、まだ見たことがありません。
どんな助けでも大歓迎です。ありがとう、
mj
IKVM を使用して Java ライブラリを .NET CIL に変換し始めました。翻訳された Java アセンブリを参照として (インプロセスで) 取り込み、翻訳された Java コードを呼び出す C# プログラムを正常に作成できます。
私の質問は、IKVM を使用して Java から C# への呼び出し (コールバック) を行う方法に詳しい人はいますか? 良いチュートリアルや説明を探していましたが、まだ見たことがありません。
どんな助けでも大歓迎です。ありがとう、
mj
ご列席の皆様、私は自分の質問を見つけました。最初にコードを実行し、次に手順を実行します。
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# クラス
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 プログラムを呼び出したり、その逆を行うことができます。ikvmc 呼び出しの「-reference」フラグに注意してください。これにより、IKVM が Java コードを変換するときに、csharpassembly.dll に注意が必要なクラス定義があることがわかります。
JaapM さん、mj_ のソリューションの CSharpLibrary は、3 番目の C# DLL プロジェクト (cshardassembly.dll) からの一時的なクラスであり、最初にコンパイルしてから、実際の Java と C# コードの間で共有すると思います。何が入っているかは関係ありません。アイデアは、両側に事前にわかっているコード (クラス) があるということです。私が正しければ、これはやり過ぎです。
長い時間が経ちましたが、ここに短い解決策を投稿したいと思います.
ジャワ:
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 インポートをサポートすることを忘れないでください。それをビルドし、-target:library パラメーターを指定して jar で ikvmc.exe を実行し、結果の 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 実行済み: [hello, world]!
返されたコールバック [42]