插件化架构指宿主程序运行时动态加载、调用外部独立编译的插件模块以扩展功能,无需重启或重新编译;在.NET中依赖AssemblyLoadContext等机制实现隔离与卸载,并需注意框架一致、接口解耦、路径规范等细节。

什么是插件化架构
插件化架构是指主程序(宿主)在运行时动态加载、调用外部独立编译的模块(插件),实现功能扩展而无需重新编译或重启主程序。在 C# 和 .NET 中,这通常依赖于 AssemblyLoadContext(.NET Core 3.0+)、AppDomain(.NET Framework)或更现代的 Microsoft.Extensions.Hosting + IHostedService 组合来隔离和管理插件生命周期。
核心步骤:从零搭建一个简单插件系统
以 .NET 6/7/8 为例,不依赖第三方框架,纯 SDK 实现:
-
定义统一契约接口:新建类库项目(如
Plugin.Abstractions),声明插件必须实现的接口,例如:public interface IPlugin { string Name { get; } void Execute(); } -
编写插件实现:新建另一个类库(如
MyFeaturePlugin),引用Plugin.Abstractions,实现接口并标记为公开类(避免 internal) -
宿主程序动态加载:在主程序中使用
AssemblyLoadContext.LoadFromAssemblyPath()加载插件 DLL;再用assembly.GetTypes().FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsAbstract)找到实现类;最后通过Activator.CreateInstance()创建实例并调用 -
注意隔离与卸载:默认 LoadContext 无法卸载,需自定义派生类并启用
isCollectible: true,否则插件 DLL 会被锁住,重复加载失败
实用增强技巧
让插件系统更健壮、易维护:
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
-
插件元数据支持:在插件程序集中添加
AssemblyMetadata("PluginType", "ReportGenerator"),宿主可通过assembly.GetCustomAttribute过滤类型() -
依赖自动解析:若插件引用了其他 NuGet 包(如 Newtonsoft.Json),宿主需在自定义
AssemblyLoadContext中重写Load方法,按需从插件目录或共享 nuget 文件夹加载依赖 -
配置驱动插件启用:用 JSON 配置文件列出插件路径和开关状态,启动时只加载
Enabled == true的项,便于灰度发布或环境差异化 - 异常隔离:每个插件应在独立 try/catch 中执行,避免单个插件崩溃拖垮整个宿主;可记录插件名称和堆栈,方便排查
避开常见坑
很多初学者卡在这几处:
- 插件项目目标框架(TargetFramework)必须与宿主一致,比如都是
net6.0;混用netstandard2.0插件在 .NET 6 宿主中可能因 API 不可用而运行时报错 - 插件中不要直接 new 主程序里的类型——这会造成强耦合;所有交互必须走抽象接口或 DTO 对象
- 调试插件时,把插件 DLL 拷贝到宿主输出目录后,VS 默认不会自动复制更新;建议在插件项目中配置
PreserveNewest - Windows 下路径大小写不敏感,但 Linux/macOS 敏感;插件路径建议用
Path.GetFullPath()标准化,避免加载失败









