C# 在java中通过JNA访问.net dll

C# 在java中通过JNA访问.net dll,c#,java,dll,java-native-interface,jna,C#,Java,Dll,Java Native Interface,Jna,我有一个.NET4.0DLL,它有一个命名空间,在该命名空间中有一个类,我想使用jna访问该类中的过程 我使用maven包括了jna.jar和platform.jar(以防万一), 我的java代码如下所示 MyConfiguration接口 import com.sun.jna.Library; public interface MyConfiguration extends Library{ public void callInterface(); } MyConfigurati

我有一个.NET4.0DLL,它有一个命名空间,在该命名空间中有一个类,我想使用jna访问该类中的过程

我使用maven包括了jna.jar和platform.jar(以防万一), 我的java代码如下所示

MyConfiguration接口

import com.sun.jna.Library;

public interface MyConfiguration extends Library{
    public void callInterface();
}
MyConfiguration myAPI = (MyConfiguration) Native
                       .loadLibrary("dll/MyAPI.dll", MyConfiguration.class);
System.out.println("Interface Created");
System.out.println("Calling Interface");
myAPI.callInterface();
访问dll代码

import com.sun.jna.Library;

public interface MyConfiguration extends Library{
    public void callInterface();
}
MyConfiguration myAPI = (MyConfiguration) Native
                       .loadLibrary("dll/MyAPI.dll", MyConfiguration.class);
System.out.println("Interface Created");
System.out.println("Calling Interface");
myAPI.callInterface();
但是我得到了一个例外--->

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'myInterface': The specified procedure could not be found.

    at com.sun.jna.Function.<init>(Function.java:208)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499)
    at com.sun.jna.Library$Handler.invoke(Library.java:199)
    at com.sun.proxy.$Proxy0.myInterface(Unknown Source)
    at foo.App.main(App.java:83)
线程“main”java.lang.UnsatisfiedLinkError中出现异常:查找函数“myInterface”时出错:找不到指定的过程。 位于com.sun.jna.Function.(Function.java:208) 位于com.sun.jna.nativellibrary.getFunction(nativellibrary.java:536) 位于com.sun.jna.nativellibrary.getFunction(nativellibrary.java:513) 位于com.sun.jna.nativellibrary.getFunction(nativellibrary.java:499) 位于com.sun.jna.Library$Handler.invoke(Library.java:199) 位于com.sun.proxy.$Proxy0.myInterface(未知源) 位于foo.App.main(App.java:83) 我已经检查了dll使用dll反编译工具,它有被调用的功能,可以有人帮助

dll使用dll反编译工具

您需要使用PE(可移植可执行文件)查看器在导出表中查找条目。(这是其中之一。)

大多数.NET DLL不会以这种方式导出函数。当他们这样做时,它是通过一种称为反向P/Invoke的机制实现的,这是大多数Microsoft.NET语言编译器不支持的。C++/CLI语言就是为此而设计的

使用Java-.NETBridge产品,您可能会找到一条更短的成功之路。或者,如果.NET DLL将类公开为COM对象,则为Java COM桥接产品。(用于检查COM DLL。)


此外,请确保DLL的位与JVM进程的位相同(例如,java.exe或javaw.exe),除非您将其用作进程外COM对象。

谢谢,在发布问题之前,我已经检查了Dependency Walker,我将在检查OLE/COM对象查看器后立即更新。