找回密码
 立即注册

QQ登录

只需一步,快速开始

Carl

版主

49

主题

213

帖子

962

积分

版主

Rank: 7Rank: 7Rank: 7

积分
962

活字格认证微信认证勋章

QQ
Carl
版主   /  发表于:2009-12-10 13:33  /   查看:7189  /  回复:0
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文件的实际位置。

DynamicallyLoadingAndUsingTypes[1].rar

24.2 KB, 下载次数: 302

rar

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部