第三方的 DLL 都统一放到 dlls 目录下

要把第三方的 DLL 都统一放到 dlls 目录下,同时保证程序能正常运行,有下面几种实现方法。

⚙️ 方法一:使用 App.config 配置(推荐,最简单)

这个方法不需要写任何代码,通过配置文件告诉 .NET 运行时去子目录里找 DLL

操作步骤如下:

  1. 新建文件夹:在程序的输出目录(比如 bin\Debug\)下,新建一个名为 dlls 的文件夹。把所有第三方的 .dll 文件都放进去

  2. 修改配置文件:在项目里找到或新建 App.config 文件,把下面的配置加进去

    xml
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <!-- 关键配置:privatePath 指向你的 dlls 文件夹 -->
          <probing privatePath="dlls"/> 
        </assemblyBinding>
      </runtime>
    </configuration>

     

  3. 调整引用属性:在 Visual Studio 的“解决方案资源管理器”中,依次选中所有需要放到 dlls 文件夹的第三方 DLL 引用,在“属性”窗口里,把 “复制本地” 设置为 False

    注意:<probing> 只能指定相对于程序运行根目录的子文件夹,不能向上级目录查找

✍️ 方法二:处理 AssemblyResolve 事件(更灵活)

如果希望有更高的控制权(例如动态决定加载路径),可以用代码来处理。这种方法适用性更广,但需要写一点代码

  1. 在程序入口订阅事件:在 Program.csMain 方法中,或在主窗体的构造函数里,尽早订阅 AppDomain.CurrentDomain.AssemblyResolve 事件

  2. 编写事件处理逻辑:当程序找不到 DLL 时,会触发这个事件。在事件处理方法里,手动去 dlls 文件夹下加载指定的程序集。

csharp
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;

namespace YourWinFormApp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // 在程序启动时,立即订阅程序集解析事件
            AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
        {
            // 获取需要加载的程序集名称(不含路径和扩展名)
            string assemblyName = new AssemblyName(args.Name).Name + ".dll";
            
            // 构建 dlls 子文件夹下的完整路径
            string assemblyPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "dlls", assemblyName);

            // 如果文件存在,则手动加载
            if (File.Exists(assemblyPath))
            {
                return Assembly.LoadFrom(assemblyPath);
            }
            
            return null; // 找不到则返回 null
        }
    }
}

 

🚀 方案对比与选择

 
特性方法一:App.config (probing)方法二:AssemblyResolve 事件
实现难度 非常简单,无需编程 需要编写少量代码
灵活性 低,只能固定查找子文件夹 ,可以自定义任何路径,甚至从网络、内存加载
适用场景 绝大多数常规项目,将DLL统一管理 需要对加载过程进行特殊控制,或处理非托管DLL等复杂情况
推荐度 ⭐⭐⭐⭐⭐ (首选) ⭐⭐⭐⭐ (备选)

如果只是单纯想让程序目录更干净,强烈建议优先使用方法一。它最快捷,也最符合 .NET 的设计规范

posted @ 2026-08-28 11:06  JohnnyLei  阅读(16)  评论(0)    收藏  举报