在Silverlight中使用DynamicMethod(动态方法)

文/代震军 出处/博客园

    DynamicMethod 类(位于System.Reflection.Emit名空间下), 用于定义并表示一种可编译、执行和丢弃的动态方法。

    而下面是微软对于DynamicMethod的应用及其运行情况的介绍:
   
    可以使用 DynamicMethod 类在运行时生成和执行方法,而不必生成动态程序集和动态类型来包含该方法。回收 DynamicMethod 对象时,由实时 (JIT) 编译器创建的可执行代码也将回收。动态方法是生成和执行少量代码的最有效方式。

    动态方法在逻辑上与模块或类型关联。如果与模块关联,动态方法对于该模块在全局范围内有效。如果有足够的权限,动态方法可以跳过 JIT 编译器的可见性检查,访问具有该模块所声明类型的私有数据。可以将动态方法与任何模块关联,无论该模块是否由您创建。

    如果动态方法与类型关联,动态方法可以访问该类型的私有成员。除非动态方法需要访问在同一模块中声明的其他类型的私有数据,否则无需跳过 JIT 可见性检查。可以将动态方法与任何类型关联。

    下表显示了动态方法与模块关联或与模块中的类型关联时,在进行以及不进行 JIT 可见性检查的情况下,动态方法可以在模块中访问的类型成员。 

 附件: 您所在的用户组无法下载或查看附件


    动态方法对所关联的模块或包含所关联的类型的模块具有权限。

    无需对动态方法及其参数进行命名,但是可以指定名称以协助调试(下文中将会介绍)。动态方法或其属性不支持自定义属性。

    这么一大块看下来,头肯定大了,而本文的例子确很简单,因为DEMO的主要代码全部取自Silverlight2 Beta2CHM, 本人也只是将其中的代码修饰一下并将主要的注释翻译了过来,希望能通过注释让大家明白动态方法到底如何写,如何用.当然因为DynamicMethod这个类的构造方法被重载了六次,而CHM中所介绍的也只是它的基本构造方法, 形如:

Code


其中:
    name 就是动态方法的名称,它可为"",但不能是null;
    returnType 为动态方法的返回值类型;
    parameterTypes 为参数的类型数组;
   

    首先请大家看一下DEMO的运行截图如下:

 附件: 您所在的用户组无法下载或查看附件
       
   
   
    而这个DEMO的主要代码就是Example.cs, 其代码如下(相关内容详见注释):

Code


代码量不是很大,但又学习又翻译却用了一些时间,希望大家见谅:)   
    当然如下链接是它的一些在线文档:
   
    http://msdn.microsoft.com/zh-cn/library/system.reflection.emit.dynamicmethod(VS.85).aspx
    http://msdn.microsoft.com/zh-cn/library/exczf7b9(en-us,VS.85).aspx   
    http://technet.microsoft.com/zh-cn/sysinternals/system.reflection.emit.dynamicmethod(VS.85).aspx   
   
    好了,今天的内容就先到这里了,呵呵:)   
    Demo源码包,请点击这里:
 附件: 您所在的用户组无法下载或查看附件

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Silverlight] 的这些文章也感兴趣:

利用托管代码的方式创建Visifire Chart
Silverlight、JavaFX、Flex/Flash技术比较
如何解决Silverlight集成到IIS无法显示页面问题
Silverlight在IE中无法显示但在Firefox中正常的原因和解决办法
在Silverlight中使用定时器(Timer)
Silverlight的文字输入功能
Silverlight教程第四部分:使用 Style 元素更好地封装观感
Silverlight 2中的视觉状态管理 Part1
Silverlight 2 (beta1)数据操作(2)
Silverlight专题(9)-WCF通信(1)