架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 720|回复: 1

[.NET Core] .NET/C# 基于 AssemblyLoadContext 实现 DLL 插件热更新

[复制链接]
发表于 2024-6-28 14:28:33 | 显示全部楼层 |阅读模式
需求:业务逻辑复杂,有定制化需求,对于此类逻辑在单独的 DLL 程序集中,后台可以动态更新程序集,执行最新的逻辑。

.NET Core 不像 .NET Framework 一样支持动态创建与卸载 AppDomain,所以一直都没有好的方法实现插件热加载,好消息是,.NET Core 从 3.0 开始支持了可回收程序集 (Collectible Assembly),我们可以创建一个可回收的 AssemblyLoadContext,用它来加载与卸载程序集。

AssemblyLoadContext 类:https://learn.microsoft.com/zh-cn/dotnet/api/system.runtime.loader.assemblyloadcontext?view=net-8.0

首先,新建一个控制台和三个类库,分别为:ConsoleApp6ClassLibraryStandardClassLibrary1ClassLibrary2,其中 ClassLibrary1、ClassLibrary2 类库都继承于 ClassLibraryStandard 中的 IWorker 接口,都实现了 Run 方法。

ClassLibraryStandard 代码:

ClassLibrary1 代码:

ClassLibrary2 代码:

ConsoleApp6 控制台代码如下:

控制台开启了3个线程在不停的动态执行 DLL 插件中的 Run 方法,并使用 log4net 记录输出结果,然后,在控制台运行 3 秒后替换 DLL 成最新的类库

在控制台运行1秒、5秒后输出当前 AssemblyLoadContext 实例的集合,也就是加载的 DLL 类库。

如下图:

QQ截图20240628142451.jpg

可以看到程序没有任何异常输出,在执行过程中也没有出现插件找不到的情况。为什么使用 log4net 记录执行结果是因为 console 是阻塞的,为了保证 3 个线程能够不断的执行,所以采用 log4net 记录执行结果,如下图:

QQ截图20240628142702.jpg

2024-06-28 14:24:36,606 INFO 11 RollingFile - 1
2024-06-28 14:24:36,606 INFO 10 RollingFile - 开始卸载
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 11 RollingFile - 1
2024-06-28 14:24:36,606 INFO 11 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 10 RollingFile - AssemblyLoadContext_Unloading
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
2024-06-28 14:24:36,606 INFO 13 RollingFile - 1
...
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,607 INFO 13 RollingFile - 1
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,606 INFO 10 RollingFile - 卸载完成
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
...
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,607 INFO 13 RollingFile - 1
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,607 INFO 13 RollingFile - 1
2024-06-28 14:24:36,607 INFO 12 RollingFile - 1
2024-06-28 14:24:36,606 INFO 11 RollingFile - 1
2024-06-28 14:24:36,607 INFO 13 RollingFile - 2
2024-06-28 14:24:36,607 INFO 12 RollingFile - 2

附上 config.xml 配置:

(完)




上一篇:关于 QRCODE 二维码容错等级
下一篇:.NET/C# 使用 PDFsharp 将多个 PDF 文件合并成一个
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-7-6 16:59:30 | 显示全部楼层
使用 Roslyn 动态编译 C# 代码并运行
https://www.itsvse.com/thread-10786-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-10-25 01:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表