我在 .NET 下使用多个 P/Invoke。但是,我希望我的库能够在 Windows 和 Linux 中运行,最好使用相同的二进制文件。
由于我依赖的 native 库可在多个平台上使用,我希望将它们与我的托管库的二进制文件一起使用。
现在我正在使用这样的东西:
[DllImport("/usr/lib/libMYLIBNAME.so.1")]
但这显然只适用于 Linux。我在考虑是否可以从/usr/lib 复制该二进制文件并与我的应用程序一起分发,因此我可以将上面的内容减少为:
[DllImport("libMYLIBNAME.so")]
但这仍然仅限于 Linux。
有没有办法更改库名称字符串,以便在 Linux 下查找 libMYLIBNAME.so,在 Windows 上查找 MYLIBNAME.dll,或类似的东西?
我想避免任何需要为每个支持的平台重新编译的东西......
(注意:更好的解决方案是在 Windows 上查找 MYLIBNAME.dll,在 Linux 上查找/usr/lib/libMYLIBNAME.so.1,但此改进是可选的)
最佳答案
两件事
1- 没有扩展名的 DllImport 这在 Windows、Linux 和 MAC 上受支持,并将为目标平台导入适当的库。
[DllImport("libMYLIBNAME")] -
2- 首选选项是使用 <dllmap/>
它允许您将导入库名称映射到目标平台库名称。所以如果在 Windows 上你有一个名为 mylib.dll
的 dll和相应的 Linux 所以是 mylinuxlib.so.3.6.1
您可以使用 Windows DLL 名称导入它
[DllImport("mylib.dll")]
并在config中添加一个配置,将这个名字映射到Linux库名
<configuration>
<dllmap dll="mylib.dll" target="mylinuxlib.so.3.6.1" />
</configuration>
阅读更多 Here
关于c# - Dll导入不完整的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711131/