首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IKVM回调的IKVM C# to Java Interop

使用IKVM回调的IKVM C# to Java Interop
EN

Stack Overflow用户
提问于 2010-11-10 21:56:56
回答 2查看 2.5K关注 0票数 3

我已经开始使用IKVM将Java库转换为.NET CIL。我可以成功地编写一个C#程序,它将转换后的Java程序集作为引用引入(inproc),并调用转换后的Java代码。

我的问题是,有谁熟悉如何使用IKVM进行从Java到C#的调用(回调)?我一直在寻找一个好的教程或解释,但还没有看到。

任何帮助都是非常感谢的。谢谢,

mj

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 01:46:08

女士们先生们,我想出了我自己的问题。代码,后跟步骤。

Java类

代码语言:javascript
复制
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#类

代码语言:javascript
复制
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有一些需要注意的类定义。

票数 5
EN

Stack Overflow用户

发布于 2016-02-12 11:57:41

JaapM,我认为mj_的解决方案中的CSharpLibrary是第三个C# DLL项目(cshardassembly.dll)中的一个临时类,他首先编译,然后在实际的java和C#代码之间共享。它里面有什么并不重要,其想法是双方都有一段预先知道的代码(类)。如果我是正确的,这有点过头了。

我知道,已经过去很长时间了,但我想在这里发布一个对我有效的简短解决方案,因为我在上面浪费了太多时间,而且IKVM文档非常糟糕:

Java:

代码语言:javascript
复制
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#:

代码语言:javascript
复制
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:你好,世界!

回调返回42

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4145208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档