与Linux中的本机库互操作

时间:2012-08-10 04:47:36

标签: c# mono dllimport

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

在Windows上通过.net框架我根据当前情况调用SetDllDirectory("x32" or "x64") 运行。在mono上,通过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,无论我使用什么发行版?

2 个答案:

答案 0 :(得分:2)

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

的输出
  

/ sbin / ldconfig -p | grep freetype

也很有用。

答案 1 :(得分:2)

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

<configuration>
    <dllmap dll="foobar" os="linux" wordsize="64" target="linux/amd64/libfoobar.so" />
    <dllmap dll="foobar" os="linux" wordsize="32" target="linux/i386/libfoobar.so" />
</configuration>

我自己没有尝试过上述内容 - dllmap文档似乎暗示目标值不是路径,但我无法确定。

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

如果您转到dlopenLoadLibarary预加载共享库,最后您可能会有更多有趣

当您的托管应用启动时,您决定使用的是哪种架构,然后在Linux上使用dlopen(),在Windows上使用LoadLibaray()