【发布时间】:2014-10-24 10:49:35
【问题描述】:
我有一个 .NET (C#) dll,它通过 Unmanaged Exports 导出函数,Java 应用程序正在使用它。
这个 C# dll(我们称之为 A.dll)有另一个托管依赖项 F3BC4DNI.dll。
所以,依赖链就像:Java class
不用说所有的dll都一起包含在application bin文件夹中了。
但是,所有 java 二进制文件都在名为 javaw.exe 的进程下运行,然后当我尝试通过 JNA 使用 A.dll 时,它正在寻找 F3BC4DNI.dll 在 javaw.exe 路径中而不是在进程监视器中可以看到与 A.dll 相同的文件夹:
我的猜测是 A.dll (.NET) 在查找依赖项时假设 进程路径。
我尝试了很多可能的解决方案,例如设置 PATH 环境变量、设置 JNA 库路径,还尝试使用 Assembly.LoadFrom 在 A.dll 中显式加载 B.dll 程序集。
运行 Java 应用程序时结果始终相同:
Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokePointer(Native Method)
at com.sun.jna.Function.invokePointer(Function.java:470)
at com.sun.jna.Function.invokeString(Function.java:651)
at com.sun.jna.Function.invoke(Function.java:395)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
当我将这些 dll 复制到 Program Files\Java...bin\ 文件夹时,它可以工作,但显然我不想在生产中以这种方式部署它。
毕竟,我唯一假设的是 Java 或 JNA 端没有问题,因为它是 .NET 相关的依赖项,所以我必须以某种方式告诉 javaw.exe .NET 依赖项在另一个文件夹中.
【问题讨论】:
标签: c# .net dll dependencies jna