利用C# 反射设计支持可扩展插件的应用程序

 

1.设计接口类:

public interface IBase
{
     void Somefun();
}

2.设计扩展插件类:

class PluginCls:IBase
{
     public void Somefun()
     {
         Console.WriteLine("hello ,i am derived class");
      }
}

3.主程序设计:

class Program
{
      static void Main(string[] args)
      {
          Assembly asm = Assembly.LoadFile(@"....\PluginCls.dll");
          Type[] clsTypes = asm.GetTypes();//可访问程序集所有定义的类型
          //Type[] clsTypes = asm.GetExportedTypes();//这个方法只能访问程序集公开定义的类型
          foreach (Type e in clsTypes)
          {
            if (e.IsClass && typeof(IBase).IsAssignableFrom(e))//兼容匹配
             {
               IBase mth = (IBase)Activator.CreateInstance(e);//类实例构造
               mth.Somefun();//调用插件类的实现方法
             }
          }
          Console.ReadKey();
        }
    }

程序输出:

 

这样主应用程序可以加载由其他人员设计的插件,无需关心该插件所定义的新类型,只要插件按照给定的接口原则设计,

主程序则可无缝加载。

 

参考:《CLR via C#》第22章,第23章

jeffrey大牛实现太屌了,写的书本本经典,墙裂推荐他的书!

利用C# 反射设计支持可扩展插件的应用程序

时间: 2024-11-07 17:43:34

利用C# 反射设计支持可扩展插件的应用程序的相关文章

第四节:设计支持加载项的应用程序

构建可扩展的应用程序时,接口是中心.可用基类来代替接口,但接口通常是首选的,因为它允许加载项开发人员选择他们自己的基类.例如,假如你要写一个应用程序,它能无缝的加载和使用别人创建的类型.下面描述了如何设计这样的应用程序. 创建一个“宿主SDK”(Host SDK)程序集,它定义了一个接口,接口的方法作为宿主应用程序和加载项之间的通信机制使用.为接口方法定义参数和返回值时,尝试使用MSCorLib.dll中定义的其他接口或类型.如果要传递并返回自己定义的数据类型,也在宿主的SDK程序集中定义他们.

利用C#中的反射机制来实现关机插件

插件编程技术 插件是指遵循一定的接口规范.可以动态加载和运行的程序模块.利用反射的动态加载代码能力,可以很容易的实现插件, 插件编程的要点是使用接口来定义插件的功能特征.插件的宿主程序通过接口来确认.装载和执行插件的功能,实现插件功能的所有类都必须实现定义插件的接口. 1.首先定义一个关机的接口 IShut,生成程序集,并在UI层(Winform窗体)来添加引用 public interface IShut { string Name { get; } void ShutDownCPU(int

试图使用未在此报表服务器中注册或此版 Reporting Services 不支持的数据扩展插件“Devart.Data.PostgreSql”

数据源用的是Postgresql 我在Deploy Report的时候出现这条ErrorMessage Error 2 试图使用未在此报表服务器中注册或此版 Reporting Services 不支持的数据扩展插件“Devart.Data.PostgreSql”. 解决方案: SQL Server安装路径\MSRS10_50.***\Reporting Services\ReportServer\rsreportserver.config里面加下面这个节点然后重启Sql server就好了<E

有哪些可以节省chrome内存的扩展插件?

不知道从什么时候开始,chrome浏览器就这样不知不觉的超过IE浏览器成为全球第一大浏览器.我们在赞赏chrome浏览器流畅的速度时,更多的是对其chrome插件功能的赞赏.但是我们也发现了一个致命的缺点:chrome标签页打开太多,电脑就会很卡.由于Chrome 采用了标签页单进程设计,所以当我们使用 Chrome 同时打开多个标签页浏览网页时,系统内存占用也将大大增加.这就是人们经常抱怨的Chrome内存占用太多的问题.虽然说使用太多的chrome插件,浏览器的速度会有影响,但是有哦没有可以

iOS8扩展插件简介

一.iOS8扩展插件概述 WWDC14除了发布了OS X v10.10和switf外,iOS8.0也开始变得更加开放了.说到开放,当然要数应用扩展(App Extension)了.顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享.可以将扩展理解为一个轻量级(nimble and lightweight)的分身. 以下为常见的三类插件: Target Type Extension point identifi

Sublime Text 前端开发常用扩展插件推荐

Sublime Text 前端开发常用扩展插件推荐 Sublime Text Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能 更重要的是,Sublime Text 易于扩展,众多开发人员为其贡献插件,而且通过包管理工具 —— Package Control 可以方便安装和管理. Package Control 安装方法 首先通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码. Sublim

设计一个可扩展的用户登录系统

在Web系统中,用户登录是最基本的功能.如何设计一个可扩展的用户登录系统呢?本文结合实际案例对用户登录系统设计进行多维度的讲解,帮助各设计者在应用中将复杂变得简单. 来源:廖雪峰的官方网站,作者:廖雪峰. [一] 在Web系统中,用户登录是最基本的功能.要实现用户名+密码登录,很多同学的第一想法就是直接创建一个Users表,包含username和password两列,这样,就可以实现登录了: id | username | password | name等其他字段 ----+----------

Sublime Text 3 支持的热门插件推荐

SublimeText是一款非常精巧的文本编辑器,适合编写代码.做笔记.写文章.它用户界面十分整洁,功能非同凡响,性能快得出奇.这些非常棒的特性 包括任意跳转(Goto Anything).多重选择(multiple selections).指令面板(command palette).免打扰模式(distraction free mode).分区编辑(split editing).快速项目切换(instant project switch),你还可以随意地自定义更多功能.还有,这款编辑器支持Ma

Sharepoint 2013列表视图和字段权限扩展插件!

记得2014年春节期间,有博客园的网友通过QQ向我咨询Sharepoint 2013列表视图和字段权限扩展,因为之前他看到我博客介绍Sharepoint 2010列表视图和字段的权限控制扩展使用,问有没有这方面的列表权限扩展插件?我告诉他Sharepoint 2010的列表权限扩展插件并不能在Sharepoint 2013中使用,不能向上兼容的,且Sharepoint 2013的功能也有所升级了,系统底层架构已发生了一些变化.由于他需要在Sharepoint 2013项目中使用到此功能,有大量的