随笔分类 - 09.Emit动态编程
生成动态程序集
摘要:对于集合的遍历,使用foreach是非常方便的,但是Emit动态生成foreach的代码就要复杂很多。它涉及到以下几个方面:(1)IEnumerable<> 是所有可枚举类型的基础接口。(2)IEnumerator<>,通过IEnumerable<> 接口的GetEnumerator方法可以获取枚举器IEnumerator<>,而对集合元素的遍历正是...
阅读全文
摘要:在大型系统中,我们经常需要监视我们系统执行的性能状况,当出现性能问题时,我们要能够迅速地找到瓶颈在什么地方。在程序的层面上来说,就是看哪个方法执行所消耗的时间很长。
阅读全文
摘要:在下面的例子中,我定义了一个事件发布类Computer,事件订阅者ComputerManager。Computer发布了一个OnAction事件,并且该事件在Increase方法被调用时触发。ComputerManager接收到事件通知时,会将成员字段handleCount增加1. 先看Computer的定义: Code highlighting produced by Act...
阅读全文
摘要:在IL中,方法的定义语法: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->.method () { } 一.Flags部分可设置 1.可访问性 privatescope: 该方法不能被引用。 priv...
阅读全文
摘要:本文通过一个简单的示例来说明在IL中进行异常处理时要注意的关键点。 我们来看一个包含try...catch...finally的示例: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> public void Test...
阅读全文
摘要:以ToString()方法为例,深入的剖析了使用Emit发射方法调用要注意的关键点。
阅读全文
摘要:本文介绍了Emit中OpCodes.Ldind_Ref 和 OpCodes.Ldind_I* 的作用区别。
阅读全文
摘要:当我将基于DataRabbit的应用程序放到windows server 2008 SP1上运行时,抛出了System.AccessViolationException,提示信息为:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。而这个应用程序在windows server 2003上一直是非常正常的。根据异常的堆栈信息,可以知道是IORMapping.GetEntityFr...
阅读全文
摘要:动态代理的一个最主要的应用场合就是实现AOP - 截获方法调用,加入自己的预处理、后处理或Around处理。 我在ESBasic.Emit中实现了对这些截获的支持。 首先,介绍两个截获者: /// /// IMethodInterceptor 对方法进行截获并加入预处理和后处理。 /// public interface IMethod...
阅读全文
摘要:我们假设静态类DataHelper类有一个静态方法: public static object GetSafeDbValue(object val) { if (val != null) { return val; } retur...
阅读全文
摘要:动态代理拥有这样的能力--使得某个类型A在运行的时候能转化为一个指定的接口I,即使这个类型A在定义的时候并没有从这个指定的接口I继承。
阅读全文
摘要:在使用泛型技术时,我们经常使用静态泛型参数,即泛型的参数类型在编译时就已经确定,比如: IList list = new List(); 集合IList的泛型参数是int类型,这在编译期就可以知道,于是,我们可以这样调用IList的Add方法: list.Add(6) ; 如果泛型的参数类型是动态的了,也就是说,只有当程序运行起来后,才知道泛型参数的具体类型,其可能是...
阅读全文