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是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。
相关推荐
@小柯555m14 小时前
MySql(高级查询--查找GPA最高值)轻刀快马14 小时前
穿透 MySQL 索引专栏 (五):【架构哲学】性能调优的终局之战:深分页灾难与千万级大表的索引设计原则DashVector14 小时前
Zvec v0.4.0 正式发布whn197715 小时前
centos10.1上安装mysql 9.6Chase_______15 小时前
计算机数据存储全解:从底层进制转换到存储介质演进薪火铺子15 小时前
布隆过滤器原理与 Redis 防穿透实战网络工程小王15 小时前
【LangGraph 子图(Subgraph)详解】学习笔记黄俊懿15 小时前
复合索引设计指南:最左前缀 & 字段排座次桃花键神15 小时前
【2026精品项目】基于SpringBoot3+Vue3的旧物置换系统(包含源码+项目文档+SQL脚本+部署教程)构建的乐趣16 小时前
测度(Measure)和概率测度(Probability Measure) 测度和度量的区别