如何使用JNA库在Java中使用C#函数
我花了很多时间试图在Java应用程序中使用C#函数,但没有成功。。。 我用C#编写了以下库: 这个dll调用另一个dll来进行一些操作,但当我编译它时,我可以在我的Realse文件夹中找到dll,一切似乎都正常,所以我使用32位选项、64位选项和任何CPU选项来编译它,以确保这不是我的问题 使用32位和任何CPU选项分析我的dll文件时,会显示找不到IESHIMS.dll,并显示以下消息: 警告:未找到至少一个延迟加载依赖项模块。 警告:由于延迟负载相关模块中缺少导出功能,至少有一个模块具有未解析的导入 64位文件不会出现这种情况,但是我找不到ConvertHtmlToPdf函数 因为我不知道它是否相关,所以我的第二步是Java代码 要加载我的库,请执行以下操作:如何使用JNA库在Java中使用C#函数,c#,java,dll,jna,C#,Java,Dll,Jna,我花了很多时间试图在Java应用程序中使用C#函数,但没有成功。。。 我用C#编写了以下库: 这个dll调用另一个dll来进行一些操作,但当我编译它时,我可以在我的Realse文件夹中找到dll,一切似乎都正常,所以我使用32位选项、64位选项和任何CPU选项来编译它,以确保这不是我的问题 使用32位和任何CPU选项分析我的dll文件时,会显示找不到IESHIMS.dll,并显示以下消息: 警告:未找到至少一个延迟加载依赖项模块。 警告:由于延迟负载相关模块中缺少导出功能,至少有一个模块具有未解
System.setProperty("jna.library.path", "C:\\Program Files (x86)\\Facilit\\Target App\\lib");
以及:
(库似乎加载成功,因为如果我尝试在运行应用程序的情况下删除dll文件,它会说无法删除,因为它正在使用中)
最后:
IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath);
但结果并非如我所愿:
java.lang.UnsatisfiedLinkError: Error looking up function 'ConvertHtmlToPdf': Could not find the specified procedure.
我不知道我做错了什么,我已经尝试了很多教程和很多东西,但任何东西似乎都有效,任何帮助都非常感谢。正如technomage所说:
JNA可以从使用C链接的DLL加载。一个C#类不会被 默认支持任何类型的C链接。C++支持C链接 外部“C”符号
展示了一种使C#DLL方法像C风格的DLL一样可调用的方法,不幸的是,它相当复杂。这个金块非常容易使用,而且工作非常完美 您需要Visual Studio 2012(express)。 安装后,只需在要导出的任何静态函数之前添加
[rgisecke.DllExport.DllExport]
。就这样
示例:
C#
Java
在顶部添加导入:
import com.sun.jna.Native;
在类中添加接口。您的C#函数名前面有字母“I”:
在类中需要DLL的位置调用DLL:
IYourFunction iYourFunction = (IYourFunction )Native.loadLibrary("full or relative path to DLL withouth the .dll extention", IYourFunction.class);//call JNA
System.out.println("Returned: " + IYourFunction.YourFunction("some parameter"));
设置
jna.library.path
实际上不会影响jna;您需要改为设置%PATH%
。后者实际上会影响共享库的加载,而jna.library.path则不会。如果在dependency walker中看不到函数名,jna肯定找不到。jna可以从使用C链接的DLL加载。默认情况下,C#类不支持任何类型的C链接。C++支持C链接,使用<代码>外部“C”<代码>符号。一些教程,或者只是一个想法?建议你可以破解C#DLL加载来做你想做的事。真的吗?我试试看:这是我自己干的。非常容易。唯一需要注意的是处理器体系结构,它必须在VS中的项目和单元测试项目、VS测试中的默认处理器体系结构设置|测试设置|默认处理器体系结构以及加载.dll的互操作环境的位之间匹配。链接已断开
[RGiesecke.DllExport.DllExport]
public static int YourFunction(string data)
{
/*Your code here*/
return 1;
}
import com.sun.jna.Native;
public interface IYourFunction extends com.sun.jna.Library
{
public int YourFunction(String tStr);
};
IYourFunction iYourFunction = (IYourFunction )Native.loadLibrary("full or relative path to DLL withouth the .dll extention", IYourFunction.class);//call JNA
System.out.println("Returned: " + IYourFunction.YourFunction("some parameter"));