C#怎么实现动态加载DLL C#如何在运行时动态加载和卸载程序集调用其中的方法【进阶】

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是一款自动视频编辑工具,可以将文本、文章或故事转换为视频。

相关推荐
21439652 小时前
CSS Grid布局如何解决图片溢出网格单元_设置object-fit与网格尺寸
jvm·数据库·python
2301_764150562 小时前
WooCommerce 用户登录状态控制元素显隐的 CSS 实现方案
jvm·数据库·python
m0_743623922 小时前
CSS如何解决响应式布局中文字溢出_通过text-overflow-ellipsis处理
jvm·数据库·python
2401_835956812 小时前
Go语言中 & 与 -:指针取址与解引用的完整解析
jvm·数据库·python
2401_837163892 小时前
如何为容器内多个列表实现统一滚动条
jvm·数据库·python
m0_674294642 小时前
C#怎么清空Dictionary字典_C#如何管理内存集合【基础】
jvm·数据库·python
2402_854808372 小时前
MongoDB GridFS分片时选择什么键比较好
jvm·数据库·python
2301_796588502 小时前
mysql如何统计不同状态的数量_使用group by配合count函数
jvm·数据库·python
qq_189807032 小时前
HTML怎么实现快捷跳转顶部_HTML固定悬浮锚点按钮【介绍】
jvm·数据库·python