【C++/C#】关于动态调用DLL路径找不着原因及解决方案

server/2025/2/12 21:28:57/

相对路径不工作的主要原因通常有以下几点:


1. C# 默认的工作目录 (Working Directory) 不一致

  • 相对路径是相对于“当前工作目录”,但这个目录 不一定 是你的 .exe 所在的目录。
  • Visual Studio 运行时,Working Directory 通常是项目的根目录project_root/bin/Debug/)。
  • 但如果:
    • 手动运行 .exeWorking Directory 可能是 .exe 所在的目录。
    • 从 C# 代码动态加载 DLL,目录可能是 进程启动的路径,与项目不同。

解决方案
在 C# 中动态获取 bin/Debug 目录,并拼接 DLL 路径:

string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SerialPortDownloadDLL.dll");
Console.WriteLine("DLL Path: " + dllPath);

然后在 [DllImport] 里使用 dllPath 变量。


2. C# DllImport 不支持动态路径

[DllImport] 必须是 编译期的常量字符串不能 用变量:

[DllImport(dllPath)]  // ❌ 不支持

如果你需要动态路径,可以用 LoadLibrary

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SerialPortDownloadDLL.dll");
IntPtr handle = LoadLibrary(dllPath);
if (handle == IntPtr.Zero)
{Console.WriteLine("Failed to load DLL!");
}

如果 LoadLibrary 返回 IntPtr.Zero,说明路径有问题。


3. DLL 可能依赖其他 DLL,搜索路径不同

  • 如果 SerialPortDownloadDLL.dll 依赖其他 DLL,但这些依赖项不在 Working Directory 里,就会加载失败。
  • Windows 默认只搜索系统路径C:\Windows\System32\C:\Windows\SysWOW64\)。
  • 你可以用 SetDllDirectory 手动添加 DLL 搜索路径:
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetDllDirectory(string lpPathName);SetDllDirectory(AppDomain.CurrentDomain.BaseDirectory);
    
    这样,C# 会优先在 bin/Debug 目录中寻找依赖项。

4. 解决方案

方法 1:动态获取 DLL 目录

string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SerialPortDownloadDLL.dll");
SetDllDirectory(AppDomain.CurrentDomain.BaseDirectory);

然后 [DllImport] 使用 "SerialPortDownloadDLL.dll"(而不是 dllPath)。

方法 2:改用绝对路径 – ps 这个好用

[DllImport(@"C:\absolute\path\to\SerialPortDownloadDLL.dll")]

方法 3:检查 Working Directory
在 C# 中打印 当前工作目录

Console.WriteLine("Current Directory: " + Environment.CurrentDirectory);

如果它不是你的 DLL 所在目录,那么相对路径就会失败。


总结

问题解决方案
Working Directory 不是 bin/DebugAppDomain.CurrentDomain.BaseDirectory 获取正确路径
DllImport 不能用变量SetDllDirectory() 指定路径
DLL 依赖其他 DLL,找不到SetDllDirectory() 确保 C# 能找到依赖项
需要动态加载LoadLibrary()

如果 改了 SetDllDirectory() 还是不行,尝试打印 Environment.CurrentDirectory,看看 C# 实际上在哪找 DLL


http://www.ppmy.cn/server/167154.html

相关文章

React进行路由跳转的方法汇总

在 React 中进行路由跳转有多种方法,具体取决于你使用的路由库和版本。以下是常见的路由跳转方法汇总,主要基于 react-router-dom 库。 1. 使用 useNavigate 钩子(适用于 react-router-dom v6) useNavigate 是 react-router-dom…

mybatis 是否支持延迟加载?延迟加载的原理是什么?

1. MyBatis 是否支持延迟加载? 是的,MyBatis 支持延迟加载。延迟加载的主要功能是推迟数据加载的时机,直到真正需要时再去加载。这种方式能提高性能,尤其是在处理关系型数据时,可以避免不必要的数据库查询。 具体来说…

ubuntu 22.04 安装 cuda sdk 11.8

ubuntu 22.04 安装 cuda sdk 11.8 linux kernel 版本太高的问题 主要思路是先安装 nv 显卡驱动,这会同时安装 kmd driver 然后安装 cuda sdk 11.x 时不安装 kernel driver 下载 display driver 搜索 display driver https://www.nvidia.com/en-us/drivers/ 选择比…

波导阵列天线学习笔记8 高增益、低轴比的3D打印Ka波段圆极化单脉冲天线阵列

摘要: 本文中, 一种3D打印的16x16圆极化单脉冲天线阵列在Ka波段研究,有着高增益和低轴比的特点。此单脉冲天线阵列有着四个低剖面的左旋圆极化子阵列和一个顺序旋转的和差网络。这四个子阵列正交连接着和差网络的输出,保证了传统2…

云原生周刊:DeepSeek 颠覆人工智能

开源项目推荐 Ollama Ollama 是一个开源的 AI 工具,旨在为用户提供简单而强大的本地部署语言模型解决方案。它支持直接在本地计算机上运行多个预训练的语言模型,能够提供与云端类似的体验,但无需依赖外部服务器或网络连接。 Ollama 的主要…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么,以及其他应用场景。如果没有,我建议你先阅读《SQLMesh系列教程-1:数据工程师的高效利器-SQLMesh》。 在本文中,我们将完成一个小项目或教程,以帮助你开始使用SQLMesh。你可以选择一步一步…

详解策略模式

引言 实现一个目标往往有多种方式,比如从上海到北京,可以选择高铁、火车、飞机、自驾等等。同样实现一个功能我们可能也有多种方法,把这些方法封装为算法,根据不同的需求选择不同的算法(策略),让…