MSIL实用指南-一维数组的操作】的更多相关文章

本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr <数组成员类型>3.保存 实例代码: ilGenerator.Emit(OpCodes.Ldc_I4_S, (); ilGenerator.Emit(OpCodes.Newarr, typeof(int)); ilGenerator.Emit(OpCodes.Stloc_0); 二.数组的成员保存这里的数…
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item"和"set_Item". 下面我们来生成如下的带有索引器的类 using System; namespace LX1_ILDemo { public class IndexerDemo { private string[,] _CustomerNames; public string th…
MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest { public static void RunAction(Action act) { act(); } public static void TestRunAction() { Action act = () => { Console.WriteLine("Test Action"…
struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体.所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针. 一.声明struct和声明class一样,用ModuleBuilder的DefineType方法,但是要求第二个参数是TypeAttributes.Sealed,第三个参数是typeof(ValueType).实例:var typeBuild…
本篇讲述怎样装箱拆箱.装箱和拆箱都是针对值类型而言的,装箱的性能开销远比拆箱的性能开销大. 装箱装箱指令是Box.使用格式是 ILGenerator.Emit(OpCodes.Box,<值类型>); 装箱当然是对一个值类型装箱的,所以第二个参数一定是int,float等一类的值类型.实例: ilGenerator.Emit(OpCodes.Box,typeof(int)); 拆箱 拆箱指令是OpCodes.Unbox_Any和OpCodes.Unbox.他们的区别是Unbox指令不包含伴随着拆…
foreach可以迭代数组或者一个集合对象.foreach语句格式是它的生成步骤是foreach (<成员> in <集合>) <循环体> 一.声明三个变量,local0调用get_Current结果,local1保存集合对象的调用GetEnumerator结果,local2调用MoveNext结果.二.声明四个标签,分别是循环开始标签.finally结束标签.MoveNext标签.get_Current标签三.调用集合对象的GetEnumerator方法,保存结果到相…
C#编程中可以给字段.方法.类以及程序集加特性即继承于Attribute的类.这里讲解怎么在IL中给它们加上特性. 生成字段的对应的类是FieldBuilder,生成属性的对应的类是PropertyBuilder,生成方法的对应的类是MethodBuilder,生成类型的对应的类是TypeBuilder,生成程序集的对应的类是AssemblyBuilder.这些类都有一个共同的方法SetCustomAttribute,而且参数都是一样的,具体是SetCustomAttribute(CustomA…
创建对象用Newobj指令,它的操作是创建一个新的对象或值类型,并将对象引用的新实例到计算堆栈上.格式是Newobj <构造函数>实例: ilGenerator.Emit(OpCodes.Newobj, typeof(Uri).GetConstructor(new Type[] { typeof(string)})); 在调用Newobj指令前,需要加载构造函数所需要的参数. 完整程序如下: using System; using System.Reflection; using System…
我们学习编程开始时,一般用输出"hello world"的一段程序. C#版的"hello world"是 using System; namespace L01_HelloDemo { class HelloWorld { class Hello { public static void Main2() { Console.WriteLine("Hello World!"); Console.ReadKey(); } } } } 用生成IL方式…
本篇讲述怎么加载null.string值.long值.float值.double值. 加载null不需要参数值,只要 Emit ldnull 其它几个命令要 Emit <指令> <值> 加载null 加载null是很简单的,使用OpCodes.Ldnull,以下一句程序就可以了. ilGenerator.Emit(OpCodes.Ldnull); 加载string值 加载string值也很简单,使用OpCodes.Ldstr,格式是 ilGenerator.Emit(OpCodes…