需要在Java中引用和使用C#dll

时间:2018-04-09 05:54:38

标签: java c# .net dll jni4net

我需要在java中引用.Net dll。我已经使用了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);
  }}

我尝试使用NetBeans 8.1 IDE执行相同操作,但没有成功。我正在使用jni4net-0.8.8.0版本和Eclipse IDE for Java Developers 版本:Oxygen.3发布(4.7.3) 任何帮助都会有所帮助!

2 个答案:

答案 0 :(得分:0)

我使用jni4net库从java调用c#dll,它运行正常。我使用了一种略微不同的方法来初始化jni4net。

>>> my_list = [2,3,5,7,8,9,10,12,14,15,17,25,31,32]
>>> [my_list[a+1:b] for l1 in [[-1]+[i for i,x in enumerate(my_list) if x%2==1]+[len(my_list)]] for a,b in zip(l1, l1[1:]) if b>a+1]
[[2], [8], [10, 12, 14], [32]]

我需要使用完整路径c:...到dll才能使其正常工作。我还不得不关心用于创建程序集的.n​​et框架版本(在我的情况下需要使用4.0和java版本8)

希望这有帮助

答案 1 :(得分:0)

我们使用JCOBridge,它可以在.NET Core(> = 3.1)和.NET Framework(> = 4.6.1)中使用。引用需要调用的DLL,您将拥有对其的完全访问权限,并且可以在项目中使用它。 考虑通用的 TestBridge.dll 中可用的以下C#代码段类:

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#的Hello World !! 2 + 3 = 5且sin(3,14159265)= 1,00000000

前面的示例显示了如何使用DLL中可用的C#类。如果您需要调用/集成.NET图形(一般意义上也是C#DLL),则JCOBridge还可以管理GUI集成(WPF / WinForms / AWT / Swing):请查看以下Examples

希望它有用且清晰。