C# 把dll分别放在指定的文件夹的方法

第一种:App.config添加配置

节点是.NET 提供的配置级程序集查找方案,它的作用是扩展.NET 运行时的默认程序集搜索路径------ 在默认搜索失败前,.NET 会自动去 配置的 privatePath 目录中查找依赖 DLL。

1.我们建立一个winform程序,对2个dll分别引用,调用里面的方法

2.打开App.config文件夹,添加如下代码

bash 复制代码
<runtime>
		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
			<!--<publisherPolicy apply="yes" />这句不要也是可以的-->
			<probing privatePath="dll;dll/lib2" />
		</assemblyBinding>
	</runtime>

dll和dll/lib2是存放库文件的指定文件夹。

注意:需要把引用中的库文件-属性-复制本地--》设置为false。否则还会在本地执行目录重新复制dll文件。

3.打开项目执行debug目录新建dll文件夹把库文件放进去就可以正常运行了。

第二种:AssemblyResolve 事件

AppDomain.CurrentDomain.AssemblyResolve 是.NET 中用于处理程序集加载失败的核心事件,是实现自定义程序集(DLL)加载逻辑的关键入口。

当.NET 运行时默认无法找到依赖的程序集(DLL)时,通过自定义逻辑指定 DLL 的查找路径并完成加载,避免程序因 "找不到程序集" 而抛出异常崩溃。

1.同样新建一个项目,将把引用中的库文件-属性-复制本地--》设置为false。

2.添加如下代码

bash 复制代码
// 注册程序集解析失败事件的处理方法
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;


private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    // 步骤1:拼接DLL的根目录(程序运行目录下的dll文件夹)
    string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"dll\");
    // 步骤2:拼接程序集文件名(去除版本信息,只保留程序集名称)
    path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);
    // 步骤3:补充.dll后缀,形成完整的DLL文件路径
    path = String.Format(@"{0}.dll", path);
    // 步骤4:根据拼接好的路径加载程序集并返回
    return System.Reflection.Assembly.LoadFrom(path);
}

3.在项目的debug文件夹中,建立代码中的名字dll文件夹,把所有的dll扔进去即可。

扩展:关于依赖 DLL文件的查询顺序

当程序需要加载某个依赖 DLL 时,.NET 会按照先默认路径、再 <probing> 配置路径的顺序查找,具体流程如下:

  1. 首先在全局程序集缓存(GAC) 中查找(GAC 是.NET 系统级程序集仓库,存放公共、强命名程序集);
  2. 然后在应用程序运行根目录(.exe 同级目录,默认核心搜索路径)中查找;
  3. 接着在 <probing> 节点 privatePath 配置的所有私有子目录中,按配置顺序依次查找;
  4. 若以上路径均未找到,则触发 AppDomain.CurrentDomain.AssemblyResolve 事件,等待自定义代码加载;
  5. AssemblyResolve 事件处理方法返回 null(自定义加载也失败),则抛出 FileNotFoundException(找不到程序集)异常,程序崩溃。
相关推荐
Lost of 程序猿2 小时前
用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践
c#·asp.net
码行山野赴时序归途2 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55232 小时前
单体项目编写思路和落地形式
java·开发语言
计算机毕设定制辅导-无忧学长3 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz3 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571763 小时前
深入理解C++ RAII
开发语言·c++
泡海椒3 小时前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
aramae4 小时前
模拟实现memset()(C语言)
c语言·开发语言·后端
wuyk5554 小时前
【Socket 进阶之路】第 7 章 IO 多路复用 select & poll 完整实战|多 fd 监听、超时等待、优缺点横向对比
服务器·开发语言·网络·数据库·物联网
船厂电气自动化ai大模型4 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习