AssemblyLoadContext(ALC)是.NET Core/.NET 5+中唯一可卸载程序集的机制,需创建isCollectible=true的非默认ALC,通过其LoadFromAssemblyPath加载,并用委托或ExecuteInLoadContext跨上下文调用,卸载前须清除所有引用并确保无后台线程或事件残留。用 AssemblyLoadContext 加载 DLL,不是 Assembly.LoadFrom直接调用 Assembly.LoadFrom 或 Assembly.LoadFile 会导致程序集永久驻留------哪怕你把它设为 null、清空引用、触发 GC,它也卸载不掉。这是 .NET Core / .NET 5+ 最常踩的坑:你以为卸载了,其实没卸。真正可卸载的路径只有一条:AssemblyLoadContext(ALC)。它把程序集隔离在独立上下文中,支持显式卸载(Unload()),前提是这个 ALC 是"非默认"的(即构造时传 isCollectible = true)。AssemblyLoadContext.Default 永远不可卸载,所有传统加载方式默认都走它必须新建一个 collectible ALC:var alc = new AssemblyLoadContext(isCollectible: true)加载必须通过该 ALC 的 LoadFromAssemblyPath 方法,不能用静态 Assembly.Load* 系列加载后,类型反射、创建实例、调用方法,全部要在该 ALC 内完成,跨 ALC 直接传类型会报 System.Runtime.Serialization.SerializationException 或类型不匹配调用 DLL 中的方法前,得先解决"跨 ALC 类型访问"问题你不能直接写 var obj = Activator.CreateInstance(type) 然后调用其方法------如果 type 来自 collectible ALC,而当前代码在默认 ALC,.NET 会拒绝操作,报错类似:Cannot load type 'XXX' from assembly 'YYY' because it is not in the same context。可行方案只有两个,且都绕不开"边界代理":用 MarshalByRefObject + 远程激活(仅限 .NET Framework,.NET Core+ 已移除 Remoting 支持)在目标 ALC 内部定义一个"桥接器"类(继承 MarshalByRefObject 不再有效),然后通过接口抽象 + AssemblyLoadContext.GetLoadContext(assembly).ExecuteInLoadContext 执行闭包逻辑更常用的是:把要调用的逻辑封装成 Func<object> 或 Action 委托,在 ALC 内部构造并返回,再在外部调用------委托本身是跨 ALC 安全的示例关键片段:var alc = new AssemblyLoadContext(isCollectible: true);var asm = alc.LoadFromAssemblyPath(@"plugin.dll");var entryType = asm.GetType("Plugin.Entry");var entry = alc.LoadFromAssemblyPath(@"plugin.dll").CreateInstance("Plugin.Entry");// ? 错误:entry 是 collectible ALC 中的对象,直接调用方法会失败// ? 正确:用反射 + Invoke,或提前在 ALC 内准备好可序列化/委托化的入口var method = entryType.GetMethod("DoWork");method.Invoke(entry, null); // ?? 仍可能失败,取决于方法内部是否引用其他 collectible 类型卸载失败?检查是否有任何托管对象还在引用该 ALCalc.Unload() 不是立即生效的异步操作,它会发起卸载请求,但只有当该 ALC 中所有对象都被 GC 回收、且无任何强引用残留时,才会真正完成。常见卡住原因: Tellers AI Tellers是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。
相关推荐
严同学正在努力2 分钟前
PostgreSQL 高可用教程(流复制 + Patroni 生产级实战)牧瀬クリスだ5 分钟前
Redis String深度解析:从底层到五大实战场景lumengabc7 分钟前
视频制作文字转语音PPT台词生成合成合并视频导出ffmpeg软件python edge-ttsMSTcheng.10 分钟前
Agent 跑到一半崩了,怎么从上一步接着跑?LangGraph StateGraph 实战:状态持久化、断点恢复与人工审批略略略咯咯13 分钟前
33333java_prinln14 分钟前
11. 说说 Single-Agent 和 Multi-Agent 的设计方案?垆边人似月.17 分钟前
第三篇:函数、文件与异常处理 / Functions, Files & Exception Handling我的xiaodoujiao18 分钟前
Django 权限系统项目实战详细图文教程 4--系统登录功能实现 2鬼手点金21 分钟前
缓存作为架构约束Random Glow29 分钟前
聚簇索引:为什么主键顺序决定插入性能