我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:彩库宝典 > 动态绑定 >

动态加载程序集与晚期绑定

归档日期:06-06       文本归类:动态绑定      文章编辑:爱尚语录

  CLR可以根据程序集清单探测一个外部应用的程序集。虽然这很好,但是在很懂时候,我们需要运行时以编程的方式动态载入程序集,即使那些程序集没有记录在程序清单中。正式地说,这种按需加载外部程序集的操作被称为动态加载。

  System.Reflection定义了一个名为Assembly类型,我们还可以动态加载私有或共享程序集,并找到关于程序集自身的特性。从本质上说,Assembly类提供的方法(尤其是Load()和LoadFrom())使你可以用编程的方法提供和客户端fig文件中同样地信息。

  晚期绑定(late binding)是一种创建一个给定类型的实例并在运行时调用其成员(活用对象),而不需要在编译时知道它存在的一种技术。当建立一个晚期绑定到外部程序集类型的应用程序时,因为没有设置程序集的引用,因此,调用程序集清单没有直接列出这个程序集。

  乍一看,晚期绑定的作用似乎不那么明显。如果可以“早期绑定”一个类型(比如,设定一个程序集引用并使用new 关键字分配类型)的话,我们当然选择早期绑定。因为早期绑定能在编译时判断(类型)是否错误,而不是在运行时判断。但是晚期绑定对于程序的可扩展性来说至关重要。

  System.Activator类是期绑定过程中的关键所在。对于我们当前的例子,只需要关注Activator.CreateInstance()方法,它用来建立一个晚期绑定类型的实例。为了适应多种情况,CreateInstance()方法经过了多次重载。其中最简单的变化是带有一个有效的Type对象,描述希望动态分配的实体。

  任何编程语言的任何特点都是有存在的道理的,C#中有些特点也许我们不求甚解的用过,但是如果知道它的使用背景与原理,使用起来将更加得心应手。本文主要分析的就是C#中的类型反射、晚期绑定、特性编程。阐释为什么要用这些语言特点?

  首先看一下简单项目的需求:程序员开发了很多模块,每个模块对应相应的功能,不同的用户可能需要使用的模块不一样,模块以插件的形式与系统集成,也就是提供给用户一个自定义模块的功能。

  更加形象的比如:一个通用的图书馆里系统中有普通老师模块、有院长模块、有校长模块、有学生模块,这些模块都具有借书的功能(每个模块借书本数不一样);这个通用的系统可能给很多学校使用,每个学校根据自己的需求选择模块。

  1、由于这些模块都具有借书的功能,首先想到的是建立一个接口,接口中包含一个借书的函数,所有模块都要实现这个接口。

  3、由于这是一个通用的系统,模块的选择应该由用户决定,因此我们不能预先把所有的模块功能都编译到系统中去(晚期绑定派上用场)。

  4、用户选择一个模块(DLL文件),就相当于要加载一个程序集DLL(动态加载的概念),此时的DLL与用C/C++编写的DLL不一样,它是由微软中间语言IL组成的,里面记录了

  5、需要调用具体某个DLL模块中的具体借书函数,这个时候就需要从动态加载的DLL中获取到相应的类,实例化类,调用类的成员函数,这个就需要反射来干了。

  6、有的时候在大型项目中,每个模块可能有不同的子部门来做,因此每个模块应该包好有这些部门的基本信息,这个时候在编写模块的功能时候,就可利用C#中的特性编程了,利用特性可以

  给模块附加上额外的信息,这些信息会被编译到程序集中,同理我们也可以反射出这些信息来。

本文链接:http://dalezaragoza.com/dongtaibangding/432.html