转自:http://www.cnblogs.com/winloa/archive/2012/03/25/2416355.html

.Net中通过反射技术的应用----插件程序的开发入门

再开始之前,先学习基本基本的概念.

程序集:所有.Net类都是定义在某个Assembly(程序集)中的,.Net基本类是定义在mscorlib.dll中。exe也可以看做是类库,也可以引用。.net的exe也是Assembly,

.net中的exe和dll的区别就是exe中包含入口函数,其他没有区别,exe也可以当成dll那样引用、也可以反编译。

GAC:全局程序集缓存。公用的Assembly放到GAC中,我们新建一个项目,会发现引用的程序集,如system,找不到这个dll放在哪里,实质上系统已注册到全局GAC中

程序集包含描述它们自己的内部版本号和它们包含的所有数据和对象类型的详细信息的元数据。

程序集具有以下特点: 程序集作为 .exe 或 .dll 文件实现。 通过将程序集放在全局程序集缓存中,可在多个应用程序之间共享程序集。 要将程序集包含在全局程序集缓存中,必须对程序集进行强命名。

有关更多信息,请参见具有强名称的程序集。

程序集仅在需要时才加载到内存中。 可以使用反射以编程方式获取关于程序集的信息。

如果加载程序集的目的只是对其进行检查,应使用诸如 ReflectionOnlyLoadFrom 的方法。 可以在单个应用程序中使用相同程序集的两个版本

OK,编写以下代码

获取当前程序已加载的所有程序集名称

运行结果:

上述是获取程序已经加载的程序集,如何动态从文件加载Assembly,不需要在编译的时候引用该文件。

首先新建一个类库项目 CLib

CLib中Person类
CLi中的IFace接口

编译CLib项目,将CLib.dll拷贝到D盘根目录下.

编写以下代码,获取CLib.dll中的信息

程序运行结果:

到这里已经能够从文件加载Assembly,并且能获取到Assembly中的数据类型,那么下一步可以如何调用CLib中Person类中的Say()方法呢?

编写以下代码:

标注出来的4个方法,是因为Person中的Name属性和Age属性的get;set;编译而成。这个可以通过反编译工具进行查看.

从文件加载Assembly,并且调用方法

到这里,已经能够从文件加载Assembly,并且调用其方法,再介绍几个方法

Type类可以叫做“类的类”,一个类型对应一个Type类的对象,通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。Type就是对类的描述。

获得Type对象的方法:

1、通过类获得Type:Type t = typeof(Person)

2、通过对象获得类的Type:Type t = p.GetType()

获得Assembly中定义的所有的public类型

在CLib项目中,新增一个类Chinese,继承与Person类

在AssemblyDemo中编写

到这里,学习和复习了简单的反射,有了这些技术点,就可以开始插件程序的编写。

插件程序实现功能如下:

开发一个简单的“记事本”程序,此程序的功能可通过插件进行扩展.

我们现在开发这一款“记事本”程序,并不知道将来以后别人会开发出怎样的功能,所以主程序开发者需要确定几个固定的方法,以后的插件开发者必须在插件中提供这几个方法给主程序使用。用什么方式来实现这个呢?---接口。so.先定义好接口

新建一个类库项目IEditorPro,在IEditorPro中新增接口

IEditor

新建一个Winform项目Notepad,在主窗体上拖一个TextBox和一个菜单栏

在Notepad新建Addins文件夹,规定用于存放插件,程序在启动时,检测Addins文件夹下的插件,如果有,则进行加载

主程序就开发完成了,此时运行程序,可见工具栏下无任何功能.

下面,我们开始为这个程序开发新的插件.首先来开发一个转换大小写的插件.

新建一个类库项目PluginToUpper,添加IEditorPro.dll的引用,新建一个类ChangeToUpper,实现接口IEditor

编译PluginToUpper项目,将PluginToUpper.dll拷贝到Notepad的Addins文件夹下.

再次运行Notepad时,插件已经OK,并且可以正常使用

再编写一个稍微复杂的插件,改变字体和字号的插件

新建一个类库项目,PluginToChangeStyle,,添加IEditorPro.dll的引用,新建一个类ChangeStyle,实现接口IEditor

因为我们要弹出窗体,让用户选择字体和字号,so.. 在PluginToChangeStyle新增一个窗口

用户选择字体和字号以后,通过委托方式来传递用户选择的字体和字号

选择字体

ChangeStyle类的代码:

ChangeStyle

编译PluginToChangeStyle项目,将PluginToChangeStyle.dll拷贝Notepad的Addins文件夹下.

再次运行Notepad时,我们编写的改变字体字号插件已经OK,并且可以正常使用

相关的代码下载:

http://115.com/file/ani80ym1#插件Demo.zip

代码写得很粗糙,主要是方便初学者的理解.主程序在扫描插件的时候,还需要考虑很多因素,也可以使用linq方式来获取.

这个插件还可以应用于MVC,实现补丁式开发.主要原理是将注册视图的代码分离,实现无缝补丁升级模式.

有空再再写.

【转】.Net中通过反射技术的应用----插件程序的开发入门的更多相关文章

  1. Android中Java反射技术的使用示例

    import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Metho ...

  2. 第89节:Java中的反射技术

    第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...

  3. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)

    1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptio ...

  4. C#反射技术概念作用和要点

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  5. C# 反射技术应用

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  6. Java高新技术第二篇:反射技术

    今天我们来看一下Java中的反射技术: 首先来了解一下Java中的反射的一些概念: Java中的反射是1.2引入的 反射的基石:class类 Class类的各个实例对象分别对应各个类在内存中的字节码, ...

  7. android中反射技术使用实例

    在计算机科学领域.反射是指一类应用,它们能够自描写叙述和自控制.也就是说,这类应用通过採用某种机制来实现对自己行为的描写叙述(self-representation)和监測(examination), ...

  8. c#中反射技术在Unity中的运用

    反射技术给类赋值的好处就是可以简化代码,封装的好处就显而易见了.最直接的用途就是用在在显示配置文件的时候,个人习惯性做法是做一个VO来存储需要的数据,其代码如下: internal class Bas ...

  9. Java中类加载和反射技术实例

    我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这 ...

随机推荐

  1. PCB的技巧

    (1)首先元件的移动,如下图中,向让D1的2引脚和R49的2引脚齐平,但是移动的距离每次都超过,不能平齐 修改元件最小移动距离即可,如下图,其中有很多可以改动的地方,但是需要改的是Component ...

  2. HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  3. 哈希(3) java中的hashcode

    看看jdk api中对object类的描述 1.http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html 2首先你要知道每个对象都有 ...

  4. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

    canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字 ...

  5. 如何在 CentOS 7 上安装 Redis 服务器

    大家好,本文的主题是 Redis,我们将要在 CentOS 7 上安装它.编译源代码,安装二进制文件,创建.安装文件.在安装了它的组件之后,我们还会配置 redis ,就像配置操作系统参数一样,目标就 ...

  6. Eclipse非常有用的快捷键

    Eclipse有强大的编辑功能, 工欲善其事,必先利其器, 掌握Eclipse快捷键,可以大大提高工作效率. 小坦克我花了一整天时间, 精选了一些常用的快捷键操作,并且精心录制了动画, 让你一看就会. ...

  7. engine中调整Element的上下显示顺序(遮盖)

    pGraphicsContainer.AddElement(pElement, 0); Engine中IGraphicsContainer类似于栈,加Element时,默认加到第一个,所以会将之前加的 ...

  8. ASP.NET- LinkButton 传递多个参数

    在使用LinkButton时可能会遇到需要传递多个参数的问题,而LinkButton的用来传递参数的属性commandargument需要传递的是一个string类型的值.因而传递多个参数时需要进行一 ...

  9. 自己封装的C#操作redis公共类

    关于C#操作redis公共类,网上有很多版本,每个版本我都看了,发觉还是不够完美,都存在一个问题,只能操作单一的缓存数据库 redis指令支持上,这里可以自己去扩展,下面分享下我近期封装的一个redi ...

  10. Day 1 @ RSA Conference Asia Pacific & Japan 2016

    # 国内出发 早上8:45的航班,首次从深圳机场乘坐国际航班(先前去日本.欧洲都从香港走),就提前了3个小时出发. 乘taxi到机场30分钟不到,135元.到了T3 4号出发口,发现check-in的 ...