0

0

C#如何实现插件化架构 .NET插件式开发教程

月夜之吻

月夜之吻

发布时间:2025-12-26 12:35:02

|

127人浏览过

|

来源于php中文网

原创

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

c#如何实现插件化架构 .net插件式开发教程

什么是插件化架构

插件化架构是指主程序(宿主)在运行时动态加载、调用外部独立编译的模块(插件),实现功能扩展而无需重新编译或重启主程序。在 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网店系统
NetShop网店系统

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() 标准化,避免加载失败
基本上就这些。不复杂但容易忽略细节。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

400

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

528

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

306

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

67

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

171

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

980

2023.10.19

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号