سؤال

لقد بدأت في استخدام IKVM لترجمة Java Libs إلى .NET CIL. يمكنني بنجاح كتابة برنامج C# يسحب (InProc) مجموعة Java المترجمة كمرجع وإجراء مكالمات إلى رمز Java المترجم.

سؤالي هو ، هل أي شخص مألوف مع كيفية إجراء مكالمات (عوائق) من Java إلى C# باستخدام IKVM؟ لقد كنت أبحث عن برنامج تعليمي جيد أو شرح لكنني لم أره بعد.

أي مساعدة موضع تقدير. شكرًا،

MJ

هل كانت مفيدة؟

المحلول

سيداتي وسادتي ، اكتشفت سؤالي. رمز لأول مرة تليها الخطوات.

فئة جافا

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 -CF myjar.jar *.class)

3) تحويل ملف JAR إلى مجموعة .NET (IKVMC -المرجع: csharpassembly.dll myjar.jar)

يجب أن تعمل في هذه المرحلة. يمكنك تشغيل برنامج C# الخاص بك ، واطلب منه الاتصال ببرنامج Java المحول والعكس بالعكس. احترس من علم "المرجع" على مكالمة IKVMC. هذا يخبر IKVM عندما يقوم بتحويل رمز Java الذي يحتوي CsharPassEmbly.dll على بعض تعريفات الفئة التي تحتاج إلى الانتباه إليها.

نصائح أخرى

JAPM ، أعتقد أن csharplibrary في حل MJ_ هو فئة عابرة من مشروع C# DLL الثالث (cshardassembly.dll) ، حيث يقوم بتجميعه أولاً ثم يشاركه بين كود Java و C# الفعلي. لا يهم ما هو فيه ، والفكرة هي أن كلا الجانبين لهما قطعة من الكود (الفئة) المعروفة مقدمًا. هذا مبالغة ، إذا كنت على صواب.

أعلم ، لقد مر وقت طويل ، لكنني أود أن أنشر حلًا قصيرًا هنا يعمل بالنسبة لي ، لقد أهدرت الكثير من الوقت عليها ، وتوثيق IKVM ضعيف للغاية:

جافا:

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 إلى جرة وإرفاقه بمشروع Java الخاص بك لدعم واردات CLI. قم بإنشائها وقم بتشغيل IKVMC.Exe على جرة مع -المعلمة المكتبة وإضافة DLL الناتجة إلى مشروع 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));
    }
}

انتاج:

المندوب المنتشر: [مرحبا ، العالم]!
عاد رد الاتصال [42

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top