|
需求:业务逻辑复杂,有定制化需求,对于此类逻辑在单独的 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
首先,新建一个控制台和三个类库,分别为:ConsoleApp6、ClassLibraryStandard、ClassLibrary1、ClassLibrary2,其中 ClassLibrary1、ClassLibrary2 类库都继承于 ClassLibraryStandard 中的 IWorker 接口,都实现了 Run 方法。
ClassLibraryStandard 代码:
ClassLibrary1 代码:
ClassLibrary2 代码:
ConsoleApp6 控制台代码如下:
控制台开启了3个线程在不停的动态执行 DLL 插件中的 Run 方法,并使用 log4net 记录输出结果,然后,在控制台运行 3 秒后替换 DLL 成最新的类库。
在控制台运行1秒、5秒后输出当前 AssemblyLoadContext 实例的集合,也就是加载的 DLL 类库。
如下图:
可以看到程序没有任何异常输出,在执行过程中也没有出现插件找不到的情况。为什么使用 log4net 记录执行结果是因为 console 是阻塞的,为了保证 3 个线程能够不断的执行,所以采用 log4net 记录执行结果,如下图:
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 文件合并成一个
|