第三方的 DLL 都统一放到 dlls 目录下
要把第三方的 DLL 都统一放到 dlls 目录下,同时保证程序能正常运行,有下面几种实现方法。
⚙️ 方法一:使用 App.config 配置(推荐,最简单)
这个方法不需要写任何代码,通过配置文件告诉 .NET 运行时去子目录里找 DLL。
操作步骤如下:
-
新建文件夹:在程序的输出目录(比如
bin\Debug\)下,新建一个名为dlls的文件夹。把所有第三方的.dll文件都放进去。 -
修改配置文件:在项目里找到或新建
App.config文件,把下面的配置加进去:<?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>
-
调整引用属性:在 Visual Studio 的“解决方案资源管理器”中,依次选中所有需要放到
dlls文件夹的第三方 DLL 引用,在“属性”窗口里,把 “复制本地” 设置为False。注意:
<probing>只能指定相对于程序运行根目录的子文件夹,不能向上级目录查找。
✍️ 方法二:处理 AssemblyResolve 事件(更灵活)
如果希望有更高的控制权(例如动态决定加载路径),可以用代码来处理。这种方法适用性更广,但需要写一点代码。
-
在程序入口订阅事件:在
Program.cs的Main方法中,或在主窗体的构造函数里,尽早订阅AppDomain.CurrentDomain.AssemblyResolve事件。 -
编写事件处理逻辑:当程序找不到 DLL 时,会触发这个事件。在事件处理方法里,手动去
dlls文件夹下加载指定的程序集。
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 的设计规范。

浙公网安备 33010602011771号