您的问题似乎不完整,您是想询问关于C语言编程的某个具体问题吗?比如C语言的语法、编程技巧、项目开发等。请提供更具体的信息,这样我才能给出更准确的回答。

摘要:众所周知C#的DllImport特性只允许将常量字符串赋值给DllName。 CC++动态库在不同平台上可能具有不同的名称。 用nativedep这个库来举例:在windows上可能叫nativedep
众所周知C#的DllImport特性只允许将常量字符串赋值给DllName。 C/C++动态库在不同平台上可能具有不同的名称。 用nativedep这个库来举例:在windows上可能叫nativedep.dll、linux上叫libnativedep.so、macos上叫libnativedep.dylib。 幸运的是C#会处理常见的变体,如果使用nativedep作为DllName,以上变体都能正确匹配: [DllImport("nativedep")] static extern int ExportedFunction(); 在 Windows 上运行时,将按以下顺序搜索 DLL: nativedep nativedep.dll(如果库名称尚未以 .dll 或 .exe 结尾) 在 Linux 或 macOS 上运行时,运行时将尝试在 lib 前添加,并追加规范共享库扩展。 在这些 OS 上,按以下顺序尝试库名称变体: nativedep.so / nativedep.dylib libnativedep.so / libnativedep.dylib 1 nativedep libnativedep 1 在 Linux 上,如果库名称以 .so 结尾或包含 .so.(注意尾随 .),则搜索顺序会有所不同。 请考虑以下示例: C# [DllImport("nativedep.so.6")] static extern int ExportedFunction(); 在这种情况下,将按以下顺序尝试库名称变体: nativedep.so.6 libnativedep.so.6 1 nativedep.so.6.so libnativedep.so.6.so 1 仅当库名称不包含目录分隔符 (/) 时才检查路径。 但不幸的是有些库作者不按常理命名,导致默认的行为不管用,比如使用“libnativedep-0.dll”这种名称。这时可以考虑使用NativeLibrary.SetDllImportResolver 来自定义解析规则。 如果你的库面向standard2.0、standard2.1,那么NativeLibrary.SetDllImportResolver 是用不了的。一个可以考虑的做法是手动改掉c/c++动态库的名称使其匹配默认规则,前提是库内部不会依赖文件名称; 另一个做法是使用kernel32.LoadLibrary、libdl.dlopen封装一个中间层。可参考 https://github.com/mellinoe/nativelibraryloader。 相关资料: 本机库加载 SetDllImportResolver不支持.NET Standard 一个中间层nativelibraryloader 一个曾经踩坑的开源库,查看提交记录363a555d可以看到作者采用了两种方式