c# - Dll导入不完整的名称

标签 c# .net pinvoke portability dllimport

我在 .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/

相关文章:

c# - 删除常规数组的元素

.net - 区分日语数字格式

.net - 为什么我的 UDP 广播失败?

c# - 从 C# 调用 stdlib.h 函数

c# - 如何编码指向结构数组指针的指针?

c# - 对象数组/集合

具有泛型类型参数的类型的 C# 扩展方法

c# - 了解 Java/C# 中的抽象和接口(interface)

C# Regex.Split 和正则表达式

c# - C# 中的 4 位枚举