C#:在 Linux 上引用或使用 .NET Core 中的 .so 文件
C# : Referencing or using .so files in .NET Core on Linux
我们在 .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) 和项目 运行s 成功使用 Fico Xpress 求解器。
现在,我们已将项目移植到 .NET Core,以便 运行 在 Linux 机器上也能做到。所以我们在 Linux 机器上安装了 Fico Xpress Solver 并使用 /opt/xpressmp/bin/ 文件夹中的优化器可执行文件测试安装是否成功(这是默认的linux 台机器的安装目录)。安装成功并且 Fico Xpress Solver 运行s 正确(使用其网站上提供的方法进行检查)。
当我们构建项目时,它编译成功,因为它仍然引用本地 lib 文件夹中所需的 dll。但是,当我们的项目在 运行 时间内调用 Fico Xpress Solver 时,它失败了,因为它无法加载所需的 dll(它可能正在 LD_LIBRARY_PATH 设置为 /opt/xpressmp/lib/,由指定的 /opt/xpressmp/bin/xpvars.sh 脚本设置在安装手册中。此文件夹包含所有 .so 文件,没有 dll 文件。)错误如下 –
Unable to load shared library 'xprb.dll' or one of its dependencies.
In order to help diagnose loading problems, consider setting the
LD_DEBUG environment variable: libxprb.dll: cannot open shared object
file: No such file or directory
我们不确定我们使用的方法,即使用 dll 进行编译和 运行 是否正确,或者我们是否必须了解如何使用 .so 文件编译和 运行 项目。由于代码构建成功,我们预计它会 运行,但找不到共享对象文件。
有人可以指定在 linux 中使用 Xpress 求解器的方法,或者在 windows 和 [=77= 上使用相同的第 3 方软件时需要遵循的一些一般准则].我们是否需要更改代码或添加对 .so 的引用而不是 .dll 文件
DllImport 是唯一的方法吗(在不同的博客上推荐)
我们终于想出了一个办法,但我们不确定它是否适用于所有人,而且它可能不会解决其他人的问题。这是我们的方法 -
如问题中所述,xprb.dll 无法加载,因为 libxprb.dll 是什么它在 Xpress lib 目录 (/opt/xpress/lib/) 中搜索。但是在 Linux 中安装 Xpress 后,安装包含 只有 .so 文件而没有 .dll 文件。
有一些博客建议使用DllImport方法加载.so文件,然后调用方法。我们没有尝试这些方法,因为我们正在寻找比这更简单的方法。
解决问题后我们发现,只有将共享库的加载指向以某种方式安装的.so 文件,它才可能起作用。所以在我们的具体情况下情况就是这样 -
- 我们在 /opt/xpressmp/lib/ 文件夹
中没有库xprb.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 是 [=56 的符号链接=]) 因此 xprb.dll 已成功加载。
我们在 .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) 和项目 运行s 成功使用 Fico Xpress 求解器。
现在,我们已将项目移植到 .NET Core,以便 运行 在 Linux 机器上也能做到。所以我们在 Linux 机器上安装了 Fico Xpress Solver 并使用 /opt/xpressmp/bin/ 文件夹中的优化器可执行文件测试安装是否成功(这是默认的linux 台机器的安装目录)。安装成功并且 Fico Xpress Solver 运行s 正确(使用其网站上提供的方法进行检查)。
当我们构建项目时,它编译成功,因为它仍然引用本地 lib 文件夹中所需的 dll。但是,当我们的项目在 运行 时间内调用 Fico Xpress Solver 时,它失败了,因为它无法加载所需的 dll(它可能正在 LD_LIBRARY_PATH 设置为 /opt/xpressmp/lib/,由指定的 /opt/xpressmp/bin/xpvars.sh 脚本设置在安装手册中。此文件夹包含所有 .so 文件,没有 dll 文件。)错误如下 –
Unable to load shared library 'xprb.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libxprb.dll: cannot open shared object file: No such file or directory
我们不确定我们使用的方法,即使用 dll 进行编译和 运行 是否正确,或者我们是否必须了解如何使用 .so 文件编译和 运行 项目。由于代码构建成功,我们预计它会 运行,但找不到共享对象文件。
有人可以指定在 linux 中使用 Xpress 求解器的方法,或者在 windows 和 [=77= 上使用相同的第 3 方软件时需要遵循的一些一般准则].我们是否需要更改代码或添加对 .so 的引用而不是 .dll 文件
DllImport 是唯一的方法吗(在不同的博客上推荐)
我们终于想出了一个办法,但我们不确定它是否适用于所有人,而且它可能不会解决其他人的问题。这是我们的方法 -
如问题中所述,xprb.dll 无法加载,因为 libxprb.dll 是什么它在 Xpress lib 目录 (/opt/xpress/lib/) 中搜索。但是在 Linux 中安装 Xpress 后,安装包含 只有 .so 文件而没有 .dll 文件。
有一些博客建议使用DllImport方法加载.so文件,然后调用方法。我们没有尝试这些方法,因为我们正在寻找比这更简单的方法。
解决问题后我们发现,只有将共享库的加载指向以某种方式安装的.so 文件,它才可能起作用。所以在我们的具体情况下情况就是这样 -
- 我们在 /opt/xpressmp/lib/ 文件夹 中没有库xprb.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 是 [=56 的符号链接=]) 因此 xprb.dll 已成功加载。