C# 如何实现插件化架构 - Assembly.Load的使用
发布时间 - 2025-12-30 00:00:00 点击率:次Assembly.Load 不适合插件化架构,应使用 AssemblyLoadContext(.NET 5+ 推荐)或 Assembly.LoadFrom(.NET Framework),配合共享接口契约实现动态加载、调用与卸载。
在 C# 中实现插件化架构,核心在于动态加载和调用外部程序集(.dll),Assembly.Load 是最基础的方式之一,但它**并不适合插件场景**——因为它只能加载已存在于 AppDomain.CurrentDomain.AssemblyResolve 路径(如 bin 目录)或 GAC 中的程序集,且无法卸载,也不支持从任意路径加载。
真正适用于插件系统的,是 AssemblyLoadContext(.NET Core/.NET 5+ 推荐)或 Assembly.LoadFrom / Assembly.LoadFile(.NET Framework 传统
方式),配合接口抽象与反射调用。下面分关键点说明:
✅ 插件必须基于契约(接口)设计
主程序与插件不能直接依赖对方的具体类型,需定义共享的接口类库(如 IPlugin.cs),供双方引用:
- 主程序只引用接口项目,不引用任何插件实现
- 每个插件项目引用同一份接口,并实现其方法(如
Execute()、GetName()) - 编译后插件为独立 .dll,放在指定目录(如
./plugins/)
✅ 动态加载插件:推荐用 AssemblyLoadContext(.NET 5+)
它支持隔离加载、显式卸载(避免内存泄漏),是现代插件系统的首选:
- 新建自定义上下文:
class PluginLoadContext : AssemblyLoadContext { ... },重写Load方法返回null表示不委托给默认上下文 - 加载插件:
var context = new PluginLoadContext(pluginPath); var assembly = context.LoadFromAssemblyPath(pluginPath); - 查找并创建插件实例:
var pluginType = assembly.GetTypes().FirstOrDefault(t => t.GetInterfaces().Contains(typeof(IPlugin))); var plugin = Activator.CreateInstance(pluginType) as IPlugin; - 使用完后调用
context.Unload()卸载整个上下文(注意:.NET 6+ 才完全支持异步卸载)
⚠️ Assembly.Load 不适用于插件
Assembly.Load("MyPlugin") 只按简单名称查找,依赖自动绑定机制,实际会去 GAC 或当前应用目录找,且一旦加载就无法卸载;Assembly.Load(AssemblyName) 同理,不适合运行时未知路径的插件。
如果你看到代码里写了 Assembly.Load 做插件加载,基本是误用——它解决的是“已知强名称、已部署好”的内部程序集引用问题,不是插件热插拔。
✅ 简单兼容方案(.NET Framework 或快速验证)
若暂不能升级到 .NET 5+,可用 Assembly.LoadFrom(path):
- 能从任意文件路径加载 .dll,并解析其依赖(自动搜索同目录)
- 但无法卸载单个程序集,整个 AppDomain 卸载才释放(所以通常不重启就无法更新插件)
- 使用前建议检查
Assembly.GetAssembly(typeof(IPlugin))是否已加载,避免重复加载同名程序集引发异常
基本上就这些。插件化不复杂,但容易忽略上下文隔离和卸载机制——选对加载方式,再配上清晰的接口契约,就能稳稳支撑模块扩展。
# c#
# app
# ai
# .net
# 架构
# NULL
# 接口
# class
# 委托
# var
# typeof
# 异步
# 加载
# 主程序
# 不适合
# 的是
# 如果你
# 也不
# 放在
# 就能
# 适用于
# 写了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Swift中循环语句中的转移语句 break 和 continue
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel怎么实现模型属性的自动加密
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
如何挑选最适合建站的高性能VPS主机?
Swift开发中switch语句值绑定模式
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel如何使用Sanctum进行API认证?(SPA实战)
长沙做网站要多少钱,长沙国安网络怎么样?
详解Android图表 MPAndroidChart折线图
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
教你用AI润色文章,让你的文字表达更专业
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
如何在万网主机上快速搭建网站?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
EditPlus中的正则表达式 实战(1)
如何快速上传建站程序避免常见错误?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Laravel如何生成URL和重定向?(路由助手函数)
如何为不同团队 ID 动态生成多个“认领值班”按钮
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel如何使用Blade模板引擎?(完整语法和示例)
如何在云虚拟主机上快速搭建个人网站?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
专业商城网站制作公司有哪些,pi商城官网是哪个?
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
中国移动官方网站首页入口 中国移动官网网页登录
,在苏州找工作,上哪个网站比较好?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
深圳网站制作平台,深圳市做网站好的公司有哪些?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
英语简历制作免费网站推荐,如何将简历翻译成英文?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
如何撰写建站申请书?关键要点有哪些?
,怎么在广州志愿者网站注册?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

