【问题标题】:C# : Referencing or using .so files in .NET Core on LinuxC#:在 Linux 上的 .NET Core 中引用或使用 .so 文件
【发布时间】:2018-12-12 11:50:24
【问题描述】:

我们有一个 .NET Framework 项目,它引用了 Fico Xpress 求解器 dll。所需的dll是–

  • Xprb.dll
  • Xprbdn.dll
  • Xprsdn.dll

由于没有可用于使用 Fico Xpress Solver 的 nuget 包,我们安装了 Fico Xpress Solver 并将这些 dll 从安装目录复制到项目文件夹内名为 lib 的本地文件夹并添加路径引用到lib文件夹中的这些dll。因此在编译时,项目使用这些 dll 的引用(存在于 lib 文件夹中)进行编译。该项目成功构建。当我们的项目调用 Fico Xpress Solver 时,上面需要的 dll 来自 安装目录 可能通过 环境变量 访问(本地文件夹中的 dll 只是为了成功编译代码,我们可以将其指向实际的 Fico Xpress Solver 安装目录,但我们将 dll 放在 lib 文件夹中,以便我们可以将其添加到 SVN)并且项目使用成功运行Fico Xpress 求解器。

现在,我们已将项目移植到 .NET Core,以便在 Linux 机器上运行相同的项目。于是我们在Linux机器上安装了Fico Xpress Solver,并使用/opt/xpressmp/bin/文件夹内的优化器可执行文件测试是否安装成功(这是linux机器的默认安装目录) .安装成功,Fico Xpress Solver 运行正常(使用他们网站上给出的方法检查)。

当我们构建项目时,它编译成功,因为它仍然引用本地 lib 文件夹中所需的 dll。但是,当我们的项目在运行时调用 Fico Xpress Solver 时,它会失败,因为它无法加载所需的 dll(它可能在设置为 /opt/ 的 LD_LIBRARY_PATH 中搜索xpressmp/lib/ 由安装手册中指定的 /opt/xpressmp/bin/xpvars.sh 脚本设置。此文件夹包含所有 .so 文件,没有 dll 文件。)错误如下 -

无法加载共享库“xprb.dll”或其依赖项之一。 为了帮助诊断加载问题,请考虑设置 LD_DEBUG 环境变量:libxprb.dll:无法打开共享对象 文件:没有这样的文件或目录

我们不确定我们使用的方法,即使用 dll 编译和运行是否正确,或者我们是否必须使用 .so 文件来编译和运行项目。由于代码构建成功,我们预计它会运行,但找不到共享对象文件。

有人可以指定在 linux 中使用 Xpress 求解器的方法,或者在 Windows 和 linux 上使用相同的 3rd 方软件时需要遵循的一些一般准则。我们是否需要更改代码或添加对 .so 的引用而不是 .dll 文件

DllImport是做到这一点的唯一方法吗(在不同的博客上建议)

【问题讨论】:

    标签: c# linux dll .net-core solver


    【解决方案1】:

    我们终于找到了一种方法,但我们不确定它是否适用于所有人,并且它可能不会解决其他人的问题。这是我们的方法 -

    如问题中所述,无法加载 xprb.dll,因为 libxprb.dll 是它在 Xpress lib 目录 (/opt/ xpress/lib/).但在 Linux 中安装 Xpress 后,安装只包含 .so 文件,没有 .dll 文件

    有一些博客建议使用 DllImport 方法来加载 .so 文件,然后调用这些方法。我们没有尝试这些方法,因为我们正在寻找比这更简单的方法。

    在解决问题后,我们发现只有将共享库的加载指向以某种方式安装的 .so 文件,它才可能起作用。所以在我们的具体案例中情况就是这样 -

    • 我们在 /opt/xpressmp/lib/ 文件夹中没有 libxprb.dll
    • 我们在 /opt/xpressmp/lib/ 文件夹中有 libxprb.so 文件而不是 libxprb.dll(如果我们没有这个文件,我们可能不知道还有哪个 .使用so文件)

    所以我们在 /opt/xpressmp/lib/ 文件夹中创建了一个符号链接文件 libxprb.dll(只要它位于 LD_LIBRARY_PATH 中的路径之一中,我们就可以将它放在任何地方) 使用命令指向 /opt/xpressmp/lib/ 文件夹中的 libxprb.so 文件 -

    ln -s /opt/xpressmp/lib/libxprb.dll /opt/xpressmp/lib/libsprb.so

    所以现在当 xprb.dll 被加载时,它会寻找 libxprb.dll,而后者又指向 libxprb.so 文件(因为 libsprb.dll 是 libxprb.so 的符号链接),因此 xprb.dll 被成功加载。

    【讨论】:

    • 我遇到了和你类似的情况(不是同一个库,而是另一个有 .dll 和 .so 版本的库),这很有帮助。有趣的是,我也可以通过将 .so 文件更改为 .dll(即 libFoo.so -> Foo.dll)来完成这项工作。
    • 我想它也适用于我们的情况,因为符号链接 (libxprb.dll) 只是指向所需的文件 (libxprb.so) 。我们并没有想到要尝试这个,因为我们认为文件扩展名必须具有一定的意义,而简单地更改扩展名可能无济于事。感谢您的方法,因为它更容易记住并向某人解释。
    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多