当前位置: 首页 > news >正文

c#编写的应用程序调用不在同一文件夹下的DLL

在C#应用程序中调用非同一文件夹下的DLL,可通过以下方法实现,确保代码整洁且运行稳定:


一、托管DLL(.NET程序集)

  1. 配置文件指定私有路径(推荐)
    修改App.configWeb.config,添加<probing>标签指定子目录:

    <configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><probing privatePath="Libs;ThirdParty" /> <!-- 多个目录用分号分隔 --></assemblyBinding></runtime>
    </configuration>
    
    • 作用:CLR会自动搜索指定子目录中的DLL(如LibsThirdParty)。
    • 限制:仅适用于托管DLL,且目录需在应用程序根目录下。
  2. 动态加载程序集(代码控制)
    订阅AssemblyResolve事件,手动加载DLL:

    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
    {string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SubFolder", new AssemblyName(args.Name).Name + ".dll");return File.Exists(dllPath) ? Assembly.LoadFrom(dllPath) : null;
    };
    
    • 适用场景:需精确控制加载逻辑(如按条件选择x86/x64版本)。

二、非托管DLL(C/C++等原生库)

  1. 设置环境变量PATH
    在程序启动时添加DLL目录到PATH:

    string dllDir = Path.Combine(Environment.CurrentDirectory, "NativeLibs");
    Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDir);
    
    • 原理:Windows搜索DLL时检查PATH环境变量。
  2. 修改当前工作目录
    临时切换目录后再调用DLL:

    string originalDir = Environment.CurrentDirectory;
    Environment.CurrentDirectory = Path.Combine(originalDir, "NativeLibs");
    // 调用DllImport方法 
    Environment.CurrentDirectory = originalDir; // 恢复目录 
    
    • 注意:可能影响其他文件操作,需谨慎使用。
  3. 完整路径DllImport(直接指定)
    在导入声明中写绝对路径:

    [DllImport(@"C:\MyApp\NativeLibs\mylib.dll")]
    public static extern void MyNativeMethod();
    
    • 缺点:路径硬编码,移植性差。

三、混合场景(托管+非托管依赖)

  • 嵌套依赖处理:若托管DLL依赖非托管DLL,需确保非托管DLL位于:
    • 应用程序根目录
    • PATH环境变量包含的目录
    • 或通过SetDllDirectoryAPI添加路径(需P/Invoke调用)。

四、调试与部署建议

  1. 调试配置(VS设置):
    • 项目属性 → 调试 → 工作目录 → 设为DLL所在目录。
    • 输出路径 → 指向DLL目录,实现编译时自动更新。
  2. 版本管理:
    • 通过配置文件绑定程序集版本,避免冲突(如<dependentAssembly>)[2][7]。
  3. 安全提示:
    • 验证外部DLL来源,防止恶意代码注入。
    • 确保DLL与应用程序架构匹配(x86/x64)。

总结方案选择

场景推荐方法
托管DLL在子目录配置文件<probing privatePath>
动态加载/条件选择DLLAssemblyResolve事件
非托管DLL设置PATH或修改工作目录
复杂依赖链结合环境变量+事件解析

通过合理组织目录结构(如/Libs/Native)并搭配上述技术,可显著提升项目可维护性。若遇版本冲突,参考强名称签名或绑定重定向。

http://www.dtcms.com/a/366021.html

相关文章:

  • Java继承
  • c++ zint二维码、条形码开发库
  • c++多线程(1)------创建和管理线程td::thread
  • Python数据分析与处理(二):将数据写回.mat文件的不同方法【超详细】
  • AI+法律:用ERNIE-Bot解析合同条款,识别风险点
  • 进程管理和IPC
  • 常用假设检验方法及 Python 实现
  • 多层环境室内定位系统综述总结
  • 【JavaEE】(22) Spring 事务
  • 苏哒智能会议一体机:让会议管理进入智能时代
  • Java与Vue构建的企业设备资产管理系统,集成后台管理与移动端操作,覆盖设备全生命周期,支持采购、维护、报废等流程,提供完整源码,助力企业高效管控资产
  • 刻意练习实践说明使用手册
  • nginx配置讲解
  • GitLens:VS Code下高效解决代码追溯的Git管理实用插件
  • Spring Boot + Nacos 配置中心示例工程
  • ego(2)---初始轨迹生成后的关键点采样
  • 一文读懂线性回归的灵魂:成本函数 J(w,b) 全解析
  • K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案
  • 华为OD最新机试真题-二进制差异数-OD统一考试(C卷)
  • 《K8s网络策略与CNI插件交互问题分析:基于真实案例的排查方法》
  • 卷积操作原来分3种
  • (二)文件管理-基础命令-mkdir命令的使用
  • C++CSP-J/S必背模板
  • Estimating the Number of Sources: An Efficient Maximization Approach
  • 上下文记忆力媲美Genie3,且问世更早:港大和可灵提出场景一致的交互式视频世界模型!
  • Guidelines for using Adaptive Platform interfaces
  • redisson功能完整指南
  • 【OpenGL】LearnOpenGL学习笔记19 - 几何着色器 Geometry Shader
  • 【机器学习深度学习】RAG边界处理策略
  • Vision Pro图像处理工具全解析