冠逹小站

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2011年3月28日

摘要: 今天下午兴冲冲的写完一段IL代码,用Reflector转成C#代码看了下,没有问题,于是引用持久化到硬盘上的动态程序集,想要试一下其中的方法,但是运行后却出现了System.AccessViolationException,提示信息为:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。看着错误提示一阵头大,新配的电脑内存损坏是不太可能了,只好从自己的程序中找原因。 经过一阵调试,终于找... 阅读全文
posted @ 2011-03-28 22:18 林冠逹 阅读(451) 评论(0) 推荐(1) 编辑

摘要: 之前在Emit的学习过程中,多次碰到了方法的调用,发现有时候是使用Call而有时候是使用Callvirt,一直对这两者的区别不甚了解。然后就查阅了MSDN,MSDN中对这两者的解释为: l Call:调用由传递的方法说明符指示的方法; l Callvirt:对对象调用后期绑定方法,并且将返回值推送到计算堆栈上。 但是看了之后还是很不明白,我想可能是因为中文版的缘故吧。今天下午再次看到了对Callv... 阅读全文
posted @ 2011-03-28 22:14 林冠逹 阅读(889) 评论(1) 推荐(0) 编辑

摘要: 异常的处理也是程序中比较重要的一个部分,今天我们就针对用IL书写异常处理代码进行讲解,首先照例给出要实现的类的C#代码,如下:class ExceptionHandler{ public static int ConvertToInt32(string str) { int num = 0; try { num = Convert.ToInt32(str); } catch (Exception ... 阅读全文
posted @ 2011-03-28 21:43 林冠逹 阅读(761) 评论(0) 推荐(0) 编辑

摘要: 之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有些地方自己也不是很明白,但毕竟还是解决了,最后比较我写的IL代码,和系统自动生成的,总有一些地方无法做到一致。特别是在为事件添加add和remove方法时,碰到了许多问题,下面我将针对这些问题进行讲解。按照惯例,先给出要实现的类的C#代码,方便反编译后对照着... 阅读全文
posted @ 2011-03-28 21:40 林冠逹 阅读(755) 评论(0) 推荐(0) 编辑

摘要: 今天我们来研究下用IL书写For循环和Foreach循环,在书中一直看到说使用Foreach循环比普通的For循环来的好,这次正好趁机来看看他们的IL代码有何不同.按照惯例,我们先给出要实现的类的C#代码,如下:class Iterator{ public int ForMethod(int[] ints) { int sum = 0; for (int i = 0; i < ints.Lengt... 阅读全文
posted @ 2011-03-28 21:29 林冠逹 阅读(749) 评论(1) 推荐(0) 编辑

摘要: 我们通过一个计算A+B的动态类来演示如何为一个动态类添加属性、构造函数、方法,以及在方法中使用类中定义的属性,按照惯例,我们先给出要实现的动态类的C#代码,然后再针对C#代码给出相应的实现,代码如下:public class Add{ private int _a = 0; public int A { get { return _a; } set { _a = value; } } privat... 阅读全文
posted @ 2011-03-28 21:24 林冠逹 阅读(1632) 评论(0) 推荐(0) 编辑

摘要: 之前的Hello World例子应该已经让我们对Emit有了一个模糊的了解,那么Emit到底是什么样一个东西,他又能实现些什么功能呢?昨天查了点资料,大致总结了下,由于才开始学习肯定有不完善的地方,希望大家能够批评指正。 1. 什么是反射发出(Reflection Emit) Emit应该是属于反射中的一个比较高级的功能,说到反射大家应该都不陌生,反射是在运行时发现对象的相关信息,并且执行这些对象... 阅读全文
posted @ 2011-03-28 20:56 林冠逹 阅读(1473) 评论(1) 推荐(0) 编辑

摘要: 按照业界的惯例,我们用一个最简单的例子——“Hello World”,来开始我们的Emit之旅。例子的相关代码及注释如下:using System;using System.Collections.Generic;using System.Text;using System.Reflection.Emit;namespace EmitExamples.HelloWorld{ class Progr... 阅读全文
posted @ 2011-03-28 20:37 林冠逹 阅读(541) 评论(0) 推荐(0) 编辑