当前位置: 首页 > 面试题库 >

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

蔚学林
2023-03-14
问题内容

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

public class Converter
{

    public Converter()
    {
    }

    public bool ConvertHtmlToPdf(String directoryPath)
    {
        //DO SOMETHING
    }
}

这个dll调用了另一个dll来进行一些操作,但是当我对其进行编译时,我可以在Realse文件夹中找到Dll,并且一切似乎都还可以,所以我使用32bit,64bit和Any
CPU选项对其进行了编译,以确保它不是我的问题。

使用32位Dependency
Walker
和任何CPU选项分析我的dll文件,它表示找不到IESHIMS.DLL,并显示此消息:

警告:至少找不到一个延迟负载依赖性模块。警告:由于依赖于延迟负载的模块缺少导出功能,因此至少一个模块的导入无法解析。

对于64位文件,它不会发生,但是我找不到我的ConvertHtmlToPdf函数。

我不知道它是否相关,所以我的第二步是在Java代码中。

要加载我的库,我需要:

System.setProperty("jna.library.path", "C:\\Program Files (x86)\\Facilit\\Target App\\lib");

和:

public interface IConversorLibrary extends Library {

    IConversorLibrary INSTANCE = (IConversorLibrary) Native.loadLibrary("converter", IConversorLibrary.class);

    void ConvertHtmlToPdf(String directoryPath);
}

(lib似乎加载成功,因为如果我尝试在运行应用程序的情况下删除dll文件,则说无法删除,原因是它正在使用中),最后:

IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath);

但是结果并不是我所希望的:

java.lang.UnsatisfiedLinkError: Error looking up function 'ConvertHtmlToPdf': Could not find the specified procedure.

我不知道自己在做什么错,我已经尝试了许多教程和很多东西,但是任何事情似乎都能奏效,真的很感谢任何帮助。


问题答案:

正如技术人员所说:

JNA可以从使用C链接的DLL中加载。默认情况下,AC#类不支持任何C链接。C ++支持使用外部“ C”符号进行C链接。

This article shows a way to
make C# DLLs methods callable like C-style DLL, unfortunately it’s a quite
complex.



 类似资料:
  • 问题内容: 我正在用Java执行一个项目,该项目具有在数据库中添加文件的功能,并且我想使用winapi函数来选择文件。我该怎么办? 问题答案: 到目前为止,最简单的方法是使用Java JNA,它已经具有stcalls的翻译功能。 您可以在JavaWorld上找到它的基础教程(至少有Winapi示例)。 您也可以使用JNI,但是JNI要求您使用专门构建的头文件进行接口连接,而这一切都很难维护和使用。

  • 我想知道是否有办法在python代码中使用c函数 例如,在做了我的研究之后,我确实使用. dll文件找到了这个解决方案。但它找不到功能我的代码: 享乐cpp: 使用cmd编译它: g有趣。cpp-o乐趣。动态链接库 使用Python调用函数,ctype: 但是我有这个错误: 回溯(最后一次调用):文件“c:\Users\User.vscode\extensions\ms python.python

  • 问题内容: 在新的Go语言中,如何调用C 代码?换句话说,如何包装我的C 类并在Go中使用它们? 问题答案: 更新: 我已经成功地将一个小型测试C ++类与Go链接在一起 如果您使用C接口包装C ++代码,则应该可以使用cgo调用您的库(请参阅中的gmp示例)。 我不确定C ++中的类概念是否真的可以在Go中表达,因为它没有继承。 这是一个例子: 我有一个C ++类定义为: 我想在Go中使用。我将

  • 我目前正在阅读React官方网站,在那里我遇到了这个问题。React官方网站声明我们可以在JSX中使用函数代码。因此,我尝试了以下代码,但不起作用。 ABCD类扩展了React。组件{ } 我知道,我知道,你们中的一些人可能会说,看看React网站上给出的例子。我看到了,官网上的例子涉及到外部功能。我只是想知道我们能否独立使用JSX内部的函数。 有关更多信息,请参阅此链接:https://reac

  • 让我们假设我在科特林有一门课,如下所示 此外,让我们定义一个内插函数生成电子邮件域,它基于给定域的名称生成电子邮件地址 现在,正如有人说Kotlin是100%可与Java互操作的,我如何在Java类中使用这个中缀函数? 上面使用infix可能不合适,但我想知道如何在Java中使用。 如果我的理解有误,请纠正。

  • 今天我为我的项目做了一个小测试——目标是:实现将文件以。我当前的/文件如下所示。 我成功地将上述内容转换为