摘要: 阅读下面的代码,直接说出输出结果。class One{ private int x = 1; public virtual void Test() { Console.WriteLine("One:" + x); }}class Two : One{ private int x = 2; public new void Test() { Console.WriteLine... 阅读全文
posted @ 2008-06-20 00:59 橡树木棉狗 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 做这个没有什么比 Mono.Cecil 更方便的了。代码过于简单,不做详述。var assembly = AssemblyFactory.GetAssembly(test.dll");foreach (CustomAttribute attribute in assembly.CustomAttributes){ if (attribute.Constructor.DeclaringType.N... 阅读全文
posted @ 2008-03-21 22:36 橡树木棉狗 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 可以说指针(Pointer)是所有编程语言的灵魂和核心,无论多高级的语言,归根结底还是使用指针和内存打交道。所不同的是现代的语言通过种种封装手段让我们可以在不了解指针的情况下就能完成相关编码,这种封装更加安全和便捷,比如 C# 里面的对象引用(object reference)。在 MSIL 的世界里,数字分为两种,而这其中就有存储内存位置的数字 —— 指针。当我们查看或者操作一个指针时,他的外在... 阅读全文
posted @ 2007-10-17 15:35 橡树木棉狗 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 1. Generic Types我们从简单的入手,试着用 IL 来编写下面这个 C# 泛型演示代码。C#class MyClass{ public void Test(T o) { Console.WriteLine(o); }}MSIL.class MyClass{ .method public specialname void .ctor() { ldarg.0 c... 阅读全文
posted @ 2007-10-17 13:35 橡树木棉狗 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 在 MSIL 中编写事件(event)要比 C# 复杂很多,其过程类似在 MSIL 中创建属性(Property)。(1) 定义事件委托类型。(2) 定义事件存储字段。(3) 定义事件及关联方法。(4) 创建事件关联方法。为了演示方便,我们直接使用 System.EventHandler 委托。.typedef [mscorlib]System.EventHandler as EventHandl... 阅读全文
posted @ 2007-10-16 16:02 橡树木棉狗 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 委托(delegate)是一种特殊的引用类型,专门设计用来描述类型安全的托管方法指针。所有的委托必须继承自 MulticastDelegate, 它们没有字段(fields)、事件(events)和属性(properties)成员,只能有几个特殊的实例方法,这些方法由 CLR 来实现其内部指令,我们只提供方法声明,并添加 runtime managed 指示标记。其中有两个强制方法,分别是 .c... 阅读全文
posted @ 2007-10-16 12:38 橡树木棉狗 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 异常处理指令 throw : 抛出托管异常。 rethrow : 重新抛出捕获的异常。 leave, leave.s : 清空堆栈,跳转到指定位置。 endfilter : filter 块结束标记。 endfinally : finally 或 fault 块结束标记。MSIL 的异常处理方式和 C# 很类似,我们看下面的演示。.method void Test(){ .entrypoint ... 阅读全文
posted @ 2007-10-15 21:20 橡树木棉狗 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 向量操作指令 newarr : 创建指定类型向量容器。 ldlen : 获取向量元素(element)数量。 ldelema : 获取指定元素的地址。 ldelem.i1, ldelem.u1, ldelem.i2, ldelem.u2, ldelem.i4, ldelem.u4, ldelem.i8, ldelem.i, ldelem.r4, ldelem.r8 : 载入指定类型的元素。 ld... 阅读全文
posted @ 2007-10-15 14:38 橡树木棉狗 阅读(143) 评论(0) 推荐(0) 编辑
摘要: (1) 装箱/拆箱指令 box : 装箱。 unbox : 拆箱。 unbox.any : 拆箱。box 对堆栈上的值类型对象进行装箱操作,值类型对象被弹出,取而代之的是一个指向托管堆(managed heap)的引用。unbox 指令和 box 正好相反,对装箱的对象进行拆箱操作,一个新的值类型对象被 "拷贝" 到本地变量表中,同时其地址被压入堆栈。unbox.any 相当于 unbox + l... 阅读全文
posted @ 2007-10-14 19:07 橡树木棉狗 阅读(129) 评论(0) 推荐(0) 编辑
摘要: (1) 引用类型寻址指令 newobj : 为引用类型(class)对象实例分配内存,并调用指定的构造方法(.ctor)。 ldobj : 通过变量地址获取对象引用。 castclass : 转换对象类型。 isinst : 判断对象是否指定类型的实例。castclass 通常用于多态转换,当转换失败时会抛出 InvalidCastException 异常。isinst 如同 C# 的关键字 as... 阅读全文
posted @ 2007-10-14 15:16 橡树木棉狗 阅读(99) 评论(0) 推荐(0) 编辑