3

IKVM を使用して Java ライブラリを .NET CIL に変換し始めました。翻訳された Java アセンブリを参照として (インプロセスで) 取り込み、翻訳された Java コードを呼び出す C# プログラムを正常に作成できます。

私の質問は、IKVM を使用して Java から C# への呼び出し (コールバック) を行う方法に詳しい人はいますか? 良いチュートリアルや説明を探していましたが、まだ見たことがありません。

どんな助けでも大歓迎です。ありがとう、

mj

4

2 に答える 2

5

ご列席の皆様、私は自分の質問を見つけました。最初にコードを実行し、次に手順を実行します。

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 に注意が必要なクラス定義があることがわかります。

于 2010-11-10T17:46:07.973 に答える
0

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]

于 2016-02-12T03:57:41.427 に答える