摘要:
在上一章中已经完成了TextBoxFilterBehavior的实现,在这一章中主要是介绍如何在NumericBox中进行格式化处理,没有看过上一章的朋友请点击这里访问。为了能够使用TextBoxFilterBehavior来进行非法字符的过滤,我们在构造函数中通过附加属性的形式添加了TextBoxFilterBehavior行为,代码如下:构造函数 Code highlighting produ... 阅读全文
2010年3月9日
摘要:
在最近的Silverlight开发中,发现一个需求,需要一个只能够输入数字,并且能够对小数点后的位数进行控制并填充的控件,原有的TextBox并不能实现这一个功能,于是就决定自己实现一个,要包含的具体的功能如下:l只能输入0-9的数字和至多一个小数点;l能够屏蔽通过非正常途径的不正确输入(输入法,粘贴等);l能够控制小数点后的最大位数,超出位数则无法继续输入;l能够选择当小数点数位数不足时是否补0... 阅读全文
2010年3月7日
摘要:
今天刚写了个Behavior,想通过代码的方式手动附加到控件上,但是一时不知道如何着手,于是就在Blend中拖出了一个Behavior,然后研究了它自动生成的xaml代码,如下:<TextBox HorizontalAlignment="Left" Margin="170,198,0,218" Width="123" TextWrapping="Wrap"> <i:Interac... 阅读全文
2010年3月6日
摘要:
在WPF中开发自定义控件时,可以将控件的默认样式放在以“<控件类型>.Generic.xaml”的形式命名的资源文件中,从而分离各个自定义控件的默认样式的定义,减少单个Generic.xaml文件的复杂度。但是在Silverlight控件开发时,却发现无法采用上面的方法来实现这一效果,尝试了许久都没有找到其他的办法实现这一效果。郁闷之中,突然想起看一下Silve... 阅读全文
2009年4月1日
摘要:
今天来介绍配置文件的定义和加载,先给出配置文件的内容,然后在详细介绍里面各节的含义,以及如何用程序加载配置文件,内容如下:[代码]配置文件中包含两个部分分别是Regeisty节和Application节,Regeisty节包含了所有切面的实现类的定义,包含id,value和isDefault三个属性:id表示这个实现的代号,在Application节可以通过这个代号来引用某个实现类,作为主键标识,... 阅读全文
2009年3月31日
摘要:
已经9点了,就不废话了,直接开讲,今天就简单的介绍下框架中用到的一些接口和属性。昨天把我们关注的切面分成了三类,现在给出这3个接口的定义:[代码]l 继承IPreProcess接口可以实现对方法执行前的处理,该方法传入一个MethodContext对象,里面包含了方法执行时的一些上下文信息,然后返回一个bool值,指示是否继续执行下面的方法;l 继承IPostProcess接口... 阅读全文
2009年3月30日
摘要:
周末两天窝在家里,使用Emit做了一个非常简单的AOP框架,当做是这几周学习Emit后的一个实践。东西出来了,自然要和大家分享一下,虽然框架做的比较粗糙、简单,但是也已经能够看到一点AOP的雏形了,用来自己无聊玩玩还是可以的,当然要用到产品中去肯定还需要长期的完善啦。说起AOP相信园子里很多高手都研究过,园子里好像也有自己的开源AOP项目,不过我时间有限没有细找,同时也发现园子研究AOP理论方面的... 阅读全文
2009年3月28日
摘要:
这两个星期来一直在学习Emit方面的相关内容,基础的理论已经基本学习完毕,剩下的就要靠实践的积累了,在学习的过程中,也把自己的心得、体会、碰到的问题都记录了下来,形成了一个Emit学习的系列文章,现在这个系列暂时告一段落,等到有了一定的实践积累,或者在实践中发现了什么新的问题,我会继续更新这一系列的文章,尤其是最后实践篇中的内容。现在将这些内容整理了一下,发到首页,希望能够对那些对Emit和IL有兴趣的人提供那么一点帮助,大家如果有什么问题可以在文后留言回复,我会尽力解答。这里留下我的联系方式:MSN:yinqql.cn@163.com QQ:413183023 ,由于工作原因只能在晚上上网,请大家谅解,最后附上这一系列文章的导航:
1. 前言
2. 基础篇
HelloWorld
基本概念介绍
OpCodes说明
为动态类添加属性、构造函数、方法
使用循环
3. 进阶篇
异常处理
定义事件
4. 答疑篇
Call和Callvirt的区别
值类型和引用类型的区别
5. 实践篇
阅读全文
2009年3月27日
摘要:
之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有些地方自己也不是很明白,但毕竟还是解决了,最后比较我写的IL代码,和系统自动生成的,总有一些地方无法做到一致。特别是在为事件添加add和remove方法时,碰到了许多问题,下面我将针对这些问题进行讲解。按照惯例,先给出要实现的类的C#代码,方便反编译后对照着... 阅读全文
摘要:
异常的处理也是程序中比较重要的一个部分,今天我们就针对用IL书写异常处理代码进行讲解,首先照例给出要实现的类的C#代码,如下:[代码]代码比较简单,主要就是阐述如何在IL代码中加入try、catch块。这里面会用到ILGenerator类中的几个新方法,介绍如下:l BeginExceptionBlock:用来表示需要异常处理的代码的开始,相当于C#代码中的try关键字;l E... 阅读全文
2009年3月24日
摘要:
今天我们来研究下用IL书写For循环和Foreach循环,在书中一直看到说使用Foreach循环比普通的For循环来的好,这次正好趁机来看看他们的IL代码有何不同.按照惯例,我们先给出要实现的类的C#代码,如下:[代码]然后,我们先来实现其中的ForMethod,相信大家已经等不及了,那么我先给出实现的IL代码,然后针对其中的关键部分进行讲解,代码如下:[代码]为了在测试时方便点,这里我为方法加上... 阅读全文
2009年3月23日
摘要:
今天下午兴冲冲的写完一段IL代码,用Reflector转成C#代码看了下,没有问题,于是引用持久化到硬盘上的动态程序集,想要试一下其中的方法,但是运行后却出现了System.AccessViolationException,提示信息为:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。看着错误提示一阵头大,新配的电脑内存损坏是不太可能了,只好从自己的程序中找原因。... 阅读全文
摘要:
之前在Emit的学习过程中,多次碰到了方法的调用,发现有时候是使用Call而有时候是使用Callvirt,一直对这两者的区别不甚了解。然后就查阅了MSDN,MSDN中对这两者的解释为:l Call:调用由传递的方法说明符指示的方法;l Callvirt:对对象调用后期绑定方法,并且将返回值推送到计算堆栈上。但是看了之后还是很不明白,我想可能是因为中文版的缘故吧。今天下午再次看到... 阅读全文
2009年3月22日
摘要:
我们通过一个计算A+B的动态类来演示如何为一个动态类添加属性、构造函数、方法,以及在方法中使用类中定义的属性,按照惯例,我们先给出要实现的动态类的C#代码,然后再针对C#代码给出相应的实现,代码如下:[代码]前面的步骤和之前的斐波那契实现相同,这里我们直接从属性的定义开始。首先,我们通过TypeBuilder对象的DefineField方法来定义私有字段_a和_b,并为它们设置默认值0,代码如下:... 阅读全文
摘要:
名称说明 Add 将两个值相加并将结果推送到计算堆栈上。 Add_Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上。 Add_Ovf_Un 将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上。 And 计算两个值的按位“与”并将结果推送到计算堆栈上。 Arglist 返回指向当前方法的参数列表的非托管指针。 Beq 如果两个值相等,则将控制转移... 阅读全文