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,但这种改进是可选的)
两件事情
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)
阅读更多在这里
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |