互操作与在Linux本地库(Interop with native libraries in lin

2019-07-30 21:54发布

我写在C#中,它是跨平台的应用程序。 它使用DllImport几个不同的库。 这也是既X32和x64。 看来工作适合我自己编译的.dll /的.so。 我把在X32子文件夹中的X32共享库,以及64共同在64子文件夹库。

在通过.NET框架的窗户我称之为SetDllDirectory("x32" or "x64")这取决于当前运行时。 在单,既可以通过在Windows,Linux或Mac,我使用DllMap ,在RandomLibrary.dll.config。 它工作正常,对于位于X32或x64目录中的文件。

不过,我也用DllImport为我没有写库,如对FreeType2。 在Windows中,我只是推的两个子文件夹中的内置库。 但是在Linux上,我宁愿用,你可以通过你的友好当地的包管理器安装libfreetype6库。 我可以硬编码DllMap链接/usr/lib/x86_64-linux-gnu/libfreetype .so.6,但我认为这取决于你用什么发行freetype的文件会改变。

有没有简单的方法在那里能够找到libfreetype.so不管我用什么发行版?

Answer 1:

使用的DllImport为Linux(“libfreetype.so.6”)应该是不够的,因为该系统应配置正确处理它。 请确保你安装了正确的软件包。 如果不工作,你可能有一个错误配置的系统:在发布你/etc/ld.so.conf.d得到错误,LD_LIBRARY_PATH的环境变量的值,/etc/ld.so.conf文件的内容和文件/。 输出

/ sbin目录/ -p LDCONFIG | grep的的FreeType

将是有用的。



Answer 2:

单吃东西/程序专门为此,它被称为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文档似乎暗示,目标值是不是一个路径,但我不能肯定。

另一种方法是有一个简单的shell脚本或批处理文件。 Linux上的shell脚本可以很容易地通过调用制定出建筑arch并设置LD_LIBRARY_PATH相应。 我一般喜欢在我的节目单壳包装(看到MyProgram.exe在控制台上的感觉丑陋)

最后,如果你的PInvoke到你可能有更多的乐趣 的dlopen或LoadLibarary预加载共享库。

当你的管理应用程序启动你决定你是什么样的架构,然后使用dlopen() ,如果在Linux或LoadLibaray()如果在Windows上。



文章来源: Interop with native libraries in linux