在.NET Core中是否有Linux等效的DllImport?

8

我正在进行一个.NET Core项目。这个项目应该可以在Linux上无问题运行。不过,我需要调用用C++创建的库。传统上,C#开发者使用DllImport&DllExport来实现这一点。

然而,在生产环境中,我不想导入或导出dll文件。在那里它需要在Linux上运行。是否有Linux版本的DllImport/DllExport? 在Linux上,使用so文件代替dll文件。当涉及到底层事物时,我并不聪明,因此我寻求快速解决方案和清晰的示例。类似于"SoImport"这样的东西吗?


1
你尝试使用DllImport了吗?据我所知,.so或.dll只是一个扩展名,因此我认为DllImport可以胜任这项工作。 - vasily.sib
4
"DLLImport" 可以与任何动态链接库(包括 .so 文件)一起使用。 - Evk
一个dll被设计为在Windows PC上运行。Linux在Windows内核之上工作,并赋予Windows UNIX功能。因此,任何编译并输出dll文件的文件都应该在Windows和Linux上运行。你必须小心,因为有些dll可能需要安装Net库,有些dll可能被编译为在64位PC上运行。 - jdweng
4
@jdweng说:“Linux运行在Windows内核之上,并赋予Windows UNIX功能”- 呃,你是指Cygwin还是虚拟机? - Steven Wood
2
.Net Core不仅仅是Windows的东西,参见:https://learn.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x。此外,Windows DLL在Linux子系统中运行的Linux应用程序中不可用,即使在Windows上也是如此。这些是ELF二进制文件,并将寻找.so格式的共享库。Windows“模拟”Linux内核,以便这些二进制文件可以原样运行,请参见此处 - Paul Sanders
您可以使用 DllImport 在 Linux 上调用未托管的库。但是,首先您需要该库。您是否拥有它?您需要一个 Linux 版本。 - David Heffernan
1个回答

10

您可以在DllImport中使用.so文件。

[DllImport ("libc.so")]
private static extern int getpid ();

从dlopen(3)手册页可以看出,程序所需的共享库按以下顺序进行搜索:

  1. 用户的LD_LIBRARY_PATH环境变量中,以冒号分隔的目录列表。这是允许CLI程序找到本地共享库的常用方式。
  2. /etc/ld.so.cache中缓存的库列表。 /etc/ld.so.cache是通过编辑/etc/ld.so.conf并运行ldconfig(8)创建的。编辑/etc/ld.so.conf是搜索其他目录的首选方式,而不是使用LD_LIBRARY_PATH,因为这更安全(将木马库插入/etc/ld.so.cache比将其插入LD_LIBRARY_PATH更困难)。
  3. /lib,然后是/usr/lib。

有关详细信息,请参见library handling

编辑:

如果libc.so包含任何未解决的符号,则DllImport将失败。请验证。

ldd -r -d libc.so

确保该处没有未解决的符号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接