Нужно ссылаться и использовать C# DLL в Java

Мне нужно ссылаться на.Net DLL в Java. Я использовал библиотеки jni4net для того же. Я следовал за шагами, упомянутыми в видео ниже:

https://www.youtube.com/watch?time_continue=351&v=8OoSK_RWUe4

Я выполнил все шаги, необходимые для ссылки на библиотеки jni4net, но я получил следующее исключение времени выполнения:

Exception in thread "main" java.lang.UnsatisfiedLinkError: orionforpython.DynamicOrion.__ctorDynamicOrion0(Lnet/sf/jni4net/inj/IClrProxy;)V
at orionforpython.DynamicOrion.__ctorDynamicOrion0(Native Method)
at orionforpython.DynamicOrion.<init>(DynamicOrion.java:25)
at com.orion.OrionForJava.main(OrionForJava.java:16)

После выполнения всех шагов, это мой код:

    package com.orion;
    import net.sf.jni4net.Bridge;
    import orionforpython.*;
    import java.io.*;
    class OrionForJava {
    public static void main(String[] args) throws IOException {
    Bridge.setVerbose(true);
    Bridge.init();
    File proxyAssemblyFile=new File("OrionForPython.dll");
    Bridge.LoadAndRegisterAssemblyFrom(proxyAssemblyFile);
    DynamicOrion orion=new DynamicOrion();
    String res=orion.ReqLogin("user", "pwd", "");
    System.out.print(res);
  }}

Я попытался выполнить то же самое с помощью среды IDE NetBeans 8.1, но безуспешно. Я использую версию jni4net-0.8.8.0 и Eclipse IDE для разработчиков Java. Версия: Oxygen.3 Release (4.7.3). Любая помощь будет полезна!

1 ответ

Мы используем JCOBridge, который можно использовать в.NET Core (>= 3.1) и.NET Framework (>= 4.6.1). Обращаясь к DLL, которую вам нужно вызвать, вы получите полный доступ к ней и сможете использовать ее в своих проектах. Рассмотрим следующий класс фрагмента C#, доступный в универсальном TestBridge.dll:

using System;

namespace TestBridge
{
    public class MyClass
    {
        /// <summary>The method <c>HelloWorld</c> return the "Hello World!!" string</summary>
        public String HelloWorld()
        {
            return "Hello World from C#!!";
        }

        /// <summary>The method <c>Add</c> return the sum of two double</summary>
        public double Add(double a, double b)
        {
            return a + b;
        }

        /// <summary>The method <c>Add</c> return the sin of a double</summary>
        public double Sin(double a)
        {
            return Math.Sin(a);
        }
    }
}

Методы предыдущего класса можно вызвать из следующего фрагмента кода Java:

import java.io.IOException;
import org.mases.jcobridge.*;

public class CSharpClassUse {

  public static void main(String[] args) {
    try {
      try {
        try {
          JCOBridge.Initialize();
          } catch (JCException e) {
            e.printStackTrace();
          }
        } catch (IOException e) {
          e.printStackTrace();
          return;
        }
        //declare and create JCOBridge instance
        JCOBridge bridge;
        bridge = JCOBridge.CreateNew();
        // adds the path where external assemblies can be found
        bridge.AddPath("Path where is TestBridge.dll assembly");
        // add REFERENCES to the .dll file you want to invoke
        bridge.AddReference("TestBridge.dll");
        // INSTANTIATE the .NET Object: JCObject is a meta object
        JCObject theNetClassInstance = (JCObject) bridge.NewObject("TestBridge.MyClass");
        double a = 2;
              double b = 3;
              double c = Math.PI/2;
              //Invoke the C# class methods
              String hello = (String) theNetClassInstance.Invoke("HelloWorld");
              double result = (double) theNetClassInstance.Invoke("Add", a, b);
              double sin = (double) theNetClassInstance.Invoke("Sin", c);
              System.out.println(String.format("%s %.0f + %.0f = %.0f and sin(%.8f) = %.8f", hello, a, b, result, c, sin));
      } catch (JCException jce) {
      jce.printStackTrace();
      System.out.println("Exiting");
      return;
    }
  }
}

Предыдущий код Java дает следующий результат:

Привет, мир от C#!! 2 + 3 = 5 и sin(3,14159265) = 1,00000000

В предыдущем примере показано, как использовать класс C#, доступный в DLL. Если вам нужно вызвать / интегрировать графику.NET, которая в общем смысле тоже является C# DLL, JCOBridge также управляет интеграцией с графическим интерфейсом пользователя (WPF/WinForms/AWT/Swing): посмотрите эти примеры

Надеюсь, это было полезно и понятно.

Я использовал библиотеку jni4net для вызова C# dll из java, и она работает нормально. Я использовал немного другой подход для инициализации jni4net.

try {
        Bridge.setVerbose(true);
        Bridge.init(new File("Full path to jni4net.n.w64.v40-0.8.8.0.dll"));
        // where dlls to load is jni4net.n.w64.v40-0.8.8.0.dll,jni4net.n-0.8.8.0.dll,MyOriginalNETDll.dll,MyOriginalNETDll.j4n.dll (after proxygen processing)
        for (String str : dllsToLoad) {
            File dll = new File(rutaDlls + str);
            Bridge.LoadAndRegisterAssemblyFrom(dll);
        }
    } catch (IOException e) {
        LOG.error("Error jniBrige.", e);
    }

Мне нужно было использовать полный путь c:... к DLL, чтобы он работал. Я также должен был позаботиться о версии.net Framework, используемой для создания сборки (необходимо использовать 4.0 в моем случае и версию Java 8)

Надеется, что это помогает

Другие вопросы по тегам