转自: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. Genotype&&陨石的秘密

    Genotype: Genotype 是一个有限的基因序列.它是由大写的英文字母A-Z组成,不同的字母表示不同种类的基因.一个基因可以分化成为一对新的基因.这种分化被一个定义的规则集合所控制.每个分化 ...

  2. Get familiar with key Frameworks of ios

    Frameworks make your life easier as an iOS Developer. They allow you to reuse code written by other ...

  3. 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET

    知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined

  4. java小算法—大衍数列

    题目:    中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理. 它的前几项是:0.2.4.8.12.18.24.32.40.50 ... 其规律是:对偶数项,是序号平 ...

  5. Java多线程小结

    简述 Java是支持多线程编程的语言,线程相比于进程更加轻量级,线程共享相同的内存空间,但是拥有独立的栈.减少了进程建立.销毁的资源消耗.jdk1.5后对java的多线程编程提供了更完善的支持,使得j ...

  6. 有用的javascript外部文件或其他外部文件引用

    1.<link href='http://fonts.googleapis.com/css?family=PT+Sans+Narrow' rel='stylesheet' type='text/ ...

  7. 用NodeJs实现延迟调用,规避定时任务的闭包问题

    很多人在用NodeJs的setTimeout(callback, delay[, arg][, ...])编写定时任务时,习惯上直接操作callback外部的对象object(闭包的特点).这样做有一 ...

  8. 15分钟弄懂 const 和 #define

    什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义 ...

  9. Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

  10. jquery.validate中使用remote,remote相同值不校验问题解决

    jquery.validate中使用remote, remote相同值不校验问题解决 >>>>>>>>>>>>>>& ...