是否可以从.NET核心调用linux平台上的共享库(.so)?

时间:2016-08-31 03:50:15

标签: c# .net shared-libraries cross-platform .net-core

我理解.NET核心的目标是跨平台开发,但我正在寻找向后兼容性。如果我有一个可用的Linux库(也许是遗留的),我希望从Linux平台的.NET核心应用程序中调用它的函数。有可能吗?

我不是在谈论ASP.NET核心,我需要它用于桌面应用程序。

2 个答案:

答案 0 :(得分:1)

是:https://github.com/dotnet/corefx/issues/343

话虽这么说,我承认还没有真正尝试过。我已经在Mono上使用了它,因为它的价值,并且绝对值得阅读他们的文档:http://www.mono-project.com/docs/advanced/pinvoke/ ...因为.net核心似乎需要大致相同方法(例如:保留p调用库的文件扩展名,以便系统可以处理链接到正确的版本等...)

例如.net核心本身如何做到这一点:

const string LIBC = "libc";

[DllImport(LIBC, EntryPoint = "getenv")]
private static extern IntPtr getenv_core(string name);

https://github.com/dotnet/corefx/blob/79d44f202e4b6d000ca6c6885a24549a55db38f1/src/System.Console/src/Interop/Interop.manual.Unix.cs

答案 1 :(得分:0)

看看SWIG。这是一种包装共享库的简单方法,它为您生成所有P / Invoke代码,并映射.so库和C#代码之间的任何头文件(思想结构)。我们在我们想要使用的.so库周围创建了一个简单的cpp包装器,然后让SWIG发挥其魔力。我们现在有一个C#库,可以从我们的.Net代码(一个简单的控制台应用程序)调用它来调用我们的linux库函数。我们在运行Ubuntu,CentOS和Debian的unix主机上的PI上完成了这项工作,取得了巨大的成功。 http://www.swig.org/