Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JNA库在Java中使用C#函数_C#_Java_Dll_Jna - Fatal编程技术网

如何使用JNA库在Java中使用C#函数

如何使用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,并显示以下消息: 警告:未找到至少一个延迟加载依赖项模块。 警告:由于延迟负载相关模块中缺少导出功能,至少有一个模块具有未解

我花了很多时间试图在Java应用程序中使用C#函数,但没有成功。。。 我用C#编写了以下库:

这个dll调用另一个dll来进行一些操作,但当我编译它时,我可以在我的Realse文件夹中找到dll,一切似乎都正常,所以我使用32位选项、64位选项和任何CPU选项来编译它,以确保这不是我的问题

使用32位和任何CPU选项分析我的dll文件时,会显示找不到IESHIMS.dll,并显示以下消息:

警告:未找到至少一个延迟加载依赖项模块。 警告:由于延迟负载相关模块中缺少导出功能,至少有一个模块具有未解析的导入

64位文件不会出现这种情况,但是我找不到ConvertHtmlToPdf函数

因为我不知道它是否相关,所以我的第二步是Java代码

要加载我的库,请执行以下操作:

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"));