【问题标题】:Loading dependent .NET assemblies using JNA使用 JNA 加载依赖的 .NET 程序集
【发布时间】: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


    【解决方案1】:
    [...]I have to somehow tell javaw.exe that .NET dependencies are in another folder.
    

    就像我怀疑的那样,当手动告诉 .NET 依赖项在哪里时,问题已经解决,使用答案 from this post

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.Object"/> class.
    /// </summary>
    static A()
    {
        AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
        {
            var path = Path.Combine(Directory.GetCurrentDirectory(), "bin\\F3BC4DNI.DLL");
            return Assembly.LoadFile(path);
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多