Post by "rickey", 2007-03-22, 18:30
-----------------------------------------------------
[引言]
在我第一次接触Leyser代码的时候,发现客户端的很多Proxy会使用传递方法名和参数的方法来调用(Invoke)WebService来获取业务数据;
当时的感觉就是---“It's amazing”,一直纳闷它究竟是怎么实现的。
最近在浏览MSDN的文章,看了反射(Reflection).程序域(Appliction Domain),程序集(Assembly)等相关章节时,有一种豁然开朗的感觉。
虽然似懂非懂,也不忘分享一下下,请高手不吝赐教。
[正文]
要实现动态地加载和使用类型(Type),达到隐匿的“晚绑定”(Late Binding),其主要技术有 :
动态加载程序集(Assembly)
动态加载类型(Type)
动态创建对象(Object)
动态创建函数(MethodInfo)
动态调用函数
Ⅰ动态加载程序集(Assembly)
动态加载程序集的方式,有如下几种:
—System.Reflection.Assembly.Load()方法,也是微软推荐的方式。
此方法有很多重载(Overloading)的方法,主要是通过程序集的名称(Assembly Name)来,返回一个Assembly对象;
—System.Reflection.Assembly.LoadFrom()方法。
此方法也三个重载方法,主要是通过程序集的文件名/路径,返回一个Assembly对象;
—System.Reflection.Assembly.ReflectionOnlyLoad()和 ReflectionOnlyLoadFrom ()方法。
这两个方法和①、②的不同点在于加载的上下文(Context),通过③方式加载的程序集,只能被Examine,不会被运行(Excute)。
—System.AppDomain.Load()方法。
此方法也是通过传递程序集的名称(Assembly Name)来,返回一个Assembly对象;不过它首要用于COM的交互。
Ⅱ动态加载类型(Type)
动态加载类型(Type)的方式,有如下几种:
—System.Type.GetType()方法。
方法通过指定程序集的全名,来获取一个Assembly。
—System.Reflection.Assembly.GetType()方法。
方法通过指定程序集的全名,来获取一个Assembly。
Ⅲ动态创建对象(Object)
动态创建对象(Object)的方式,有如下几种:
— System.Reflection.Assembly.CreateInstance()方法。
通过传递程序集的全名来创建实例。
— System.Activator.CreateInstance()方法。
通过传递Type来创建实例。
— System.AppDomain.CreateInstance()方法。
通过传递程序集名称和类型名称来创建实例。
Ⅳ动态创建函数(MethodInfo)
—System.Type.GetMethod()方法。
通过传递方法名来获得方法的实例。
Ⅴ动态调用函数
调用函数涉及到对象和函数,主要有以下的方式:
— System.Reflection.MethodInfo.Invoke()方法。
通过传递对象和函数的参数,来调用此对象上的函数。
— System.Type.InvokeMember()方法。
通过传递函数名,对象和参数,来调用此对象上的函数。
[结尾]
附件的代码中实现了两种方式。
[注意]
要运行此代码,请将DynamicallyLoadingAndUsingTypes工程中的Main中的filePath变量指定为你要调用的Assembly文件的实际位置。 |
|