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是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。
相关推荐
luckdewei11 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化aqi0017 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能Csvn18 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速金銀銅鐵1 天前
[Python] 从《千字文》中随机挑选汉字cup112 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南aqi002 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG金銀銅鐵2 天前
用 Python 实现 Take-Away 游戏copyer_xyf2 天前
Agent 流程编排