首页 > 范文大全 > 正文

基于.net反射机制的插件技术的研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于.net反射机制的插件技术的研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:基于插件技术的软件架构将软件分为宿主程序、插件和接口三个部分,宿主程序和插件通过接口契约进行通信,通过新增插件以及扩展原有插件的方法来实现软件功能的扩展及修改。本文以.net为开发平台,研究了如何使用动态加载程序集、反射、晚期绑定这几种反射机制的核心方法进行插件加载、动态发现和使用插件中的类型及方法并且实例化插件,为构建一种可以灵活扩展的应用程序提供了解决思路。

关键词:.NET;插件;反射

中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2011) 21-0000-02

Plug-in Technology Research Based on .Net Reflection

Xu Ning,Li Jian

(School of Computer Science,Southwest Petroleum University,Xindu 610500,China)

Abstract:According to the software framework of plug-in technology,software can be divided into three parts:host program,plug-in and interface.Host program and plug-in communicate by interface contracts,with the new plug-in and the expanded original plug-in,the expansion and modification of software function can be accomplished.Based development platform,this paper researches how to use dynamic loading assembly,reflection and late binding this three core methods of reflection mechanism to do plug-in loading,dynamic discovery,plug-in using and instantiation,provides a solution to construct a kind of application program which can expand flexibly.

Keywords:.NET;Plug-in;Reflection

任何一款软件,无论研发人员在开发前做过多么详细的用户调查和需求分析,当软件开发完成后,在使用过程中用户的需求发生了变化或者软件的某些功能需要改进,传统的工作流程是根据新的需求重新编码,编译,重新部署应用程序。显然,传统的工作流程是繁琐的,低效率的。如果能不修改软件源代码,不重新编译,不重新部署,在软件正常运行的状态下,找到一种方式使软件具有灵活,良好的扩展性,无疑效率将得到很大的提高。目前,为了设计出可维护性强、易扩展、易重用的软件,较好的方式是采用插件技术.本文探讨了插件技术的概念、结构和特点,并且通过一个实例演示了在.NET平台下使用反射机制实现插件实例化。

一、原理与相关技术

(一)插件技术简介

插件技术的本质是在不修改程序原始代码,不重新编译源代码,不重新部署软件,不影响软件正常使用的前提下灵活的对软件功能进行的优化和扩充。使用插件技术的主要目的就是要提高软件的重用性,提高软件的模块化程度使软件具有灵活的可扩展性,避免不必要的重复编码工作,提高编程效率,降低模块间的关联,提高软件的可维护性。目前,插件技术在各种应用程序中得到广泛应用,如Photoshop、MS Office System等软件中都用到了插件技术。

我们在使用插件技术开发软件时,将软件划分为宿主程序,插件和接口这三个主要的部分。

宿主程序作为插件的载体,是整个软件的基础。首先,宿主程序可以脱离插件单独运行,它可以完成基本的系统功能,比如:界面管理功能等。其次,宿主程序最重要的功能是插件管理,插件管理负责解析插件程序集,提取其中的插件类型信息,并生成相应的插件对象。

接口是宿主程序和插件间通信的契约,宿主程序和插件根据契约中的规则进行具体的工作。插件通过接口获取宿主程序和其他插件中,它所需要的数据。宿主程序通过接口调用插件所实现的功能。

插件是根据契约编写出来的,可以动态的插入系统,实现具体功能的程序模块,实质上就是一个保存在插件程序集中的dll文件。

(二)程序集

程序集是一个以公共语言运行库为宿主的,版本化的,自描述的二进制文件,它是一个类型的容器,其中所有必要的信息,如清单、类型元数据、CIL代码等,都包含在一个*.dll文件中,它是.net平台下最基本的部署单元,是插件技术的物理基础。

(三)反射机制

反射机制就是在宿主程序运行时动态的加载插件程序集并获得插件程序集中相关的信息,使用和创建编译时未知的类型,并能调用这些类型中方法的能力,它是插件技术的逻辑基础。

第一步,我们使用Reflection命名空间下的Assembly类的相关方法就能在宿主程序运行时动态加载插件程序集,这里只介绍其中一种方法。代码如下:

using System.Reflection;

Assembly MyFirstAsm = Assembly.LoadFrom("D:\MyExample\MyFirstAsm.dll");

第二步,当插件程序集加载成功后,通过System.Type类中的相关方法获得插件程序集中的信息,用这些信息来判断这个插件是否符合接口契约中的约定,如果符合就执行第三步。代码如下:

//得到插件中所有的类型

Type[] MyTypes = MyFirstAsm.GetTypes();

//是否有类型符合接口契约的约定。

for(int i = 0;i

{

Type type = MyTypes[i].GetInterface("Interface_example");

if(type !=null)//符合接口约定

{

//执行第三步

}

}

第三步,通过System.Activator类中的相关方法进行晚期绑定建立符合契约约定对象的实例。代码如下:

object MyObject = MyFirstAsm.CreateInstance(MyTypes[i].FullName);

以上,简述了宿主程序用反射机制发现,加载,实例插件的过程。

二、.net平台下插件技术的实现

下面通过一个例子来说明如何使用插件技术构建一个可扩展应用程序的过程。这个例子包括以下程序集:

a.Interface_example.dll:接口程序集,通过interface关键字创建接口,在接口程序中签订宿主程序和插件双方应该遵守的契约,通过接口来表现宿主程序需要扩展的点。

b.CSharpAddin.dll:插件程序集,我们将实现接口的类设计成动态链接库的形式,通过插件来实现宿主程序的扩展。

c.MainApp.dll:宿主程序集,宿主程序通过反射机制动态的发现插件,加载插件,实例化插件,达到自身功能的扩展。

(一)构建Interface_example.dll

例子中的Interface_example接口为宿主程序所使用的插件提供了一个多态的接口,纯粹为了举例,我只写了一个方法。

namespace Interface_example

{

interface Interface_example

{

void Show();

}

}

(二)构建插件CSharpAddin.dll

using Interface_example;//引用接口的dll文件

namespace CSharpAddin

{

class Class1:Interface_example

{

void Interface_example.Show()

{

MessageBox.Show("My first CSharp Addin");

}

}

}

(三)构建可扩展的宿主程序

using Interface_example;//必须要引用接口的dll文件

private void Form1_Load(object sender, EventArgs e)

{

//使用绝对路径

Assembly MyFirstAsm = Assembly.LoadFrom("D:\MyExample\MyFirstAsm.dll");

//获得插件中的所有类型

Type[] MyTypes = MyFirstAsm.GetTypes();

//是否有类型符合Interface_example接口

for(int i = 0;i

{

Type type = MyTypes[i].GetInterface("Interface_example");

if(type !=null)//找到符合的接口

{

//实例化这个接口

object MyObject = MyFirstAsm.CreateInstance(MyTypes[i].FullName);

Interface_example iexp = MyObject as Interface_example;

iexp.Show();

}

}

上面的例子给出了一种基于.Net反射机制的简单插件实现方案,为插件技术的实现提供一个参考,对此方案可以进一步扩充, 实现更为灵活的实现方案。

三、结束语

插件与调用插件的宿主程序通过接口契约关联起来.程序员针对特定的需求编写插件,只要插件符合接口契约中和宿主程序的约定,就能动态的插入到系统当中,实现系统功能的灵活扩展。本文先介绍了插件技术的相关概念,插件技术的优势,然后介绍了在.net平台下使用反射机制构成插件所需的技术,最后给出了一个使用反射机制构成插件的设计思路以及一些必要的技术细节。

参考文献:

[1](美)Karli Watson Christian Nagel等,康博译.C#入门经典[M].北京:清华大学出版社,2006

[2]陈方明,陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计者,2005,26:172-173

[3]朱有产,李玉凯,李自强.基于NET反射技术的规约插件实现原理[J].继电器,2006,34(22):60-63

[4]XinChen.应用框架的设计与实现――.NET平台[M].北京:电子工业出版社.2005,7