与Linux中的本机库互操作

我正在用C#编写一个应用程序,它是跨平台的。 它将DllImport用于几个不同的库。 它也是x32和x64。 它似乎适用于我自己编译的.dll / .so。 我将x32共享库放在x32子文件夹中,将x64共享库放在x64子文件夹中。

在Windows上通过.net框架我根据当前运行时调用SetDllDirectory("x32" or "x64") 。 在单声道上,通过windows,linux或mac,我在RandomLibrary.dll.config中使用DllMap 。 它适用于位于x32或x64目录中的文件。

但是,我也将DllImport用于我没有编写的库,例如FreeType2。 在Windows上,我只是将构建的库推送到两个子文件夹中。 但是在Linux上,我宁愿使用你可以通过友好的本地包管理器安装的libfreetype6库。 我可以将DllMap链接硬编码到/usr/lib/x86_64-linux-gnu/libfreetype .so.6,但我认为freetype文件会根据你使用的发行版而改变。

有什么简单的方法,它可以找到libfreetype.so无论我使用什么发行版?

对Linux使用DllImport(“libfreetype.so.6”)就足够了,因为系统应配置为正确处理它。 确保安装了正确的软件包。 如果它不起作用,您可能有一个配置错误的系统:发布您获得的错误,LD_LIBRARY_PATH env var值,/ etc / ld.so.conf的内容和/etc/ld.so.conf.d中的文件/。 的输出

/ sbin / ldconfig -p | grep freetype

也会很有用。

Mono有一个专门用于此的事物/程序,它被称为DllMap 。 您可以指定在哪个平台上加载哪个非托管libaray。 例如:

     

我没有尝试过上面的内容 – dllmap文档似乎暗示目标值不是路径,但我不能确定。

另一种方法是使用简单的shellcript或批处理文件。 在linux上,shell脚本可以通过调用arch并相应地设置LD_LIBRARY_PATH来轻松地计算出体系结构。 我通常更喜欢我的单声道程序周围的shell包装器(看到控制台上的MyProgram.exe感觉很难看)

最后,如果您在dlopen或LoadLibarary中预先加载共享库,那么您可能会有更多乐趣

当您的托管应用程序启动时,您决定使用什么体系结构,然后在Linux上使用dlopen() ,如果在Windows上则使用LoadLibaray()