当前位置: 首页 > news >正文

C#高级进阶---关于插件开发(初版)

一、关于插件

        插件开发是一种使应用程序功能可扩展的技术。通过插件,应用程序可以动态地加载和使用外部功能模块,而无需重新编译整个程序。

1. 插件架构设计

插件系统通常包含以下几个核心部分:

  • 主程序(Host Application):主程序是插件的宿主,它负责加载和管理插件。主程序定义了插件接口(通常是一个抽象类或接口),所有插件都必须实现这个接口。

  • 插件接口(Plugin Interface):这是一个定义插件应实现的功能的接口或抽象类。主程序通过这个接口来调用插件的功能。

  • 插件(Plugin):插件是实现了插件接口的具体类,它提供了扩展主程序功能的实际代码。

二、插件开发

1. 插件接口的定义

首先,你需要定义一个插件接口。这个接口指定了所有插件需要实现的方法。例如:

服务实现示例:C#进阶-了解IOC控制反转及相关框架的使用 

    public interface IPlugin{/// <summary>/// 提供给插件加载配置或初始化代码/// </summary>void Load();/// <summary>/// 提供给插件执行耗时操作,或者执行流程,该方法将被异步执行/// </summary>void Run();/// <summary>/// 提供给插件释放资源/// </summary>void Dispose();/// <summary>/// 提供给插件往平台注册服务/// </summary>void Register(IService service);}

2. 实现插件

然后,你可以实现一个或多个插件,每个插件都需要实现插件接口:

    public class MyTestPlugin : IPlugin{public void Load(){MessageBox.Show("Load");}public void Register(IService service){MessageBox.Show("Register");}public void Run(){MessageBox.Show("Run");}public void Dispose(){MessageBox.Show("Dispose");}}

3. 主程序的插件管理

主程序需要能够发现和加载插件。可以使用反射来实现这个功能,反射允许你在运行时动态地加载程序集和创建实例。以下是一个简单的示例:

    public static class PluginCenter{static List<IPlugin> plugins;public static void LoadPlugins(string pluginDir){plugins = new List<IPlugin>();var files = Directory.GetFiles(pluginDir, "*.dll");foreach (var file in files){//var assem = Assembly.LoadFrom(file);var assem = Assembly.LoadFile(file);var pluginTypes = assem.GetTypes().Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface);foreach (var type in pluginTypes)plugins.Add(Activator.CreateInstance(type) as IPlugin);}}public static void ExecutePlugins(){if (plugins is null) return;        PluginLoad();PluginRegister();PluginRun();}public static void PluginRegister(){foreach (var plugin in plugins){plugin.Register(IOCService.Instance);}}public static void PluginLoad(){foreach (var plugin in plugins){plugin.Load();}}public static void PluginRun(){foreach (var plugin in plugins){plugin.Run();}}public static void PluginDispose(){foreach (var plugin in plugins){plugin.Dispose();}}}

4. 使用插件

最后,在主程序中使用插件管理器来加载和执行插件:

string pluginDir = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Plugins");private void LoadAndExecutePlugin()
{PluginCenter.LoadPlugins(pluginDir);PluginCenter.ExecutePlugins();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在Ubuntu 16.04上安装MongoDB的方法
  • MySQL多表查询,找出包含全部标签的邮件,包含任意标签的邮件
  • 【Go - 特殊导入包方式 . 和 _】
  • mybatis-plus中Swagger 模式和Kotlin 模式是什么?
  • matlab 计算矩阵元素的标准差
  • 条件拼接 - 根据入参生成where条件
  • 15 种高级 RAG 技术 ——从预检索到生成
  • zabbix对接Grafana
  • turtlebot 测试 Gazebo Harmonic ROS Jazzy
  • 新安装的mariadb 对应的my.cnf 对应的配置
  • 配置PXE预启动执行环境:使用PXE装机服务器网络引导装机
  • uni-app - - - - - 自定义状态栏
  • 基于STM32与INA219的智能充电桩方案:实时电压监测、费用计算及MySQL云端数据管理的全面技术解析(代码示例)
  • 网络应用层之(2)DNS协议
  • 前端宝典十五:设计模式之前端开发5大设计原则
  • [译]CSS 居中(Center)方法大合集
  • Angular2开发踩坑系列-生产环境编译
  • create-react-app做的留言板
  • CSS 专业技巧
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 内存分配及垃圾回收机制初探
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Promise面试题2实现异步串行执行
  • Redis中的lru算法实现
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Terraform入门 - 1. 安装Terraform
  • v-if和v-for连用出现的问题
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​ssh免密码登录设置及问题总结
  • ​如何使用QGIS制作三维建筑
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $(function(){})与(function($){....})(jQuery)的区别
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (03)光刻——半导体电路的绘制
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转载)从 Java 代码到 Java 堆
  • (轉貼) UML中文FAQ (OO) (UML)
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET MVC第五章、模型绑定获取表单数据
  • .net和php怎么连接,php和apache之间如何连接
  • .NET微信公众号开发-2.0创建自定义菜单
  • ??在JSP中,java和JavaScript如何交互?
  • @Controller和@RestController的区别?