DllImport不完整的名字

lui*_*bal 1 .net c# pinvoke portability dllimport

我在.NET下使用了几个P/Invokes.但是,我希望我的库可以在Windows和Linux中工作,最好使用相同的二进制文件.

由于我所依赖的本机库可以在多个平台上使用,因此我希望将它们与托管库的二进制文件一起使用.

现在我正在使用这样的东西:

[DllImport("/usr/lib/libMYLIBNAME.so.1")]
Run Code Online (Sandbox Code Playgroud)

但这显然只适用于Linux.我正在考虑我可以从/ usr/lib复制那个二进制文件并随我的应用程序一起分发,所以我可以将上面的内容减少到:

[DllImport("libMYLIBNAME.so")]
Run Code Online (Sandbox Code Playgroud)

但这仍然只是Linux.

无论如何都要更改库名称字符串,以便它在Linux下查找libMYLIBNAME.so和Windows上的MYLIBNAME.dll,或者非常类似的东西?

我想避免任何需要为每个支持的平台重新编译的东西......

(注意:更好的解决方案是在Windows上寻找MYLIBNAME.dll,在Linux上寻找/usr/lib/libMYLIBNAME.so.1,但这种改进是可选的)

Chr*_*lor 7

两件事情

1- DllImport不带扩展名Windows,Linux和MAC支持此功能,并将为目标平台导入相应的库.

[DllImport("libMYLIBNAME")] - 
Run Code Online (Sandbox Code Playgroud)

2- preffered选项是使用<dllmap/>允许您将导入库名称映射到目标平台库名称的选项.因此,如果在Windows上你有一个dll调用mylib.dll和相应的Linux,那么mylinuxlib.so.3.6.1你可以使用Windows DLL名称导入它

[DllImport("mylib.dll")]
Run Code Online (Sandbox Code Playgroud)

并在配置中添加配置以将此名称映射到Linux库名称

<configuration>
  <dllmap dll="mylib.dll" target="mylinuxlib.so.3.6.1" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

阅读更多在这里

  • 离开扩展程序不起作用,我试过了. (2认同)