这一篇讲解怎么加载bool值.sbyte值.byte值.char值.short值. 加载bool值在.NET程序实际运行中,是没有true和false值的,实际上是以1和0表示它们,加载它们的指令是Ldc_I4_1和Ldc_I4_0.下面是实际例子:/* 加载true,即加载1 */ilGenerator.Emit(OpCodes.Ldc_I4_1);/* 加载false,即加载0 */ilGenerator.Emit(OpCodes.Ldc_I4_0); 加载sbyte值sbyte是8位有符号…
这一篇讲的是怎样加载整数值到运算栈上.这一类的指令都是以Ldc_I4开头. Ldc_I4类OpCodes的Ldc_I4字段的功能是把一个int值压入运算栈上.它的使用方法是ilGenerator.Emit(OpCodes.Ldc_I4, <整数值>);产生的指令是ldc.i4 <整数值>几个例子 ilGenerator.Emit(OpCodes.Ldc_I4, 2000);//ldc.i4 2000 ilGenerator.Emit(OpCodes.Ldc_I4, -100);//…
本篇讲述怎么加载null.string值.long值.float值.double值. 加载null不需要参数值,只要 Emit ldnull 其它几个命令要 Emit <指令> <值> 加载null 加载null是很简单的,使用OpCodes.Ldnull,以下一句程序就可以了. ilGenerator.Emit(OpCodes.Ldnull); 加载string值 加载string值也很简单,使用OpCodes.Ldstr,格式是 ilGenerator.Emit(OpCodes…
本篇讲解怎么加载和保存参数,以及参数起始序号的确定. 参数的加载加载参数的指令是Ldarg.Ldarg_S.Ldarg_0.Ldarg_1.Ldarg_2.Ldarg_3.Ldarg_0是加载第0个参数,例子 ilGenerator.Emit(OpCodes.Ldarg_0);Ldarg_1是加载第1个参数,例子 ilGenerator.Emit(OpCodes.Ldarg_1);Ldarg_2是加载第2个参数,例子 ilGenerator.Emit(OpCodes.Ldarg_2);Ldarg…
MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest { public static void RunAction(Action act) { act(); } public static void TestRunAction() { Action act = () => { Console.WriteLine("Test Action"…
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item"和"set_Item". 下面我们来生成如下的带有索引器的类 using System; namespace LX1_ILDemo { public class IndexerDemo { private string[,] _CustomerNames; public string th…
字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成this. 静态字段的加载加载静态字段的指令是Ldsfld.ilGenerator.Emit(OpCodes.Ldsfld, <FieldBuilder>);实际例子 ilGenerator.Emit(OpCodes.Ldsfld, areaFieldBuilder); ilGenerator.Emit(OpCodes.Call, writeStringLineMethod); 静态字段的保存保存静态字段的指令…
这一篇讲解方法内的局部变量是怎么声明.怎样保存.怎样加载的. 声明局部变量声明用ILGenerator的DeclareLocal方法,参数是局部变量的数据类型,得到一个局部变量对应的创建类LocalBuilder.使用格式是LocalBuilder localBuilderx = ilGenerator.DeclareLocal(typeof(<数据类型>));实际例子 LocalBuilder localBuilderv1 = ilGenerator.DeclareLocal(typeof(…
本篇讲解怎么生成和操作一维数组.各种数组类型创建的步骤是一样的,但是加载和保存步骤有所不同. 一.创建数组所有类型的一维数组创建都是一样的,分三步.1.加载数组长度2.生成指令 Newarr <数组成员类型>3.保存 实例代码: ilGenerator.Emit(OpCodes.Ldc_I4_S, (); ilGenerator.Emit(OpCodes.Newarr, typeof(int)); ilGenerator.Emit(OpCodes.Stloc_0); 二.数组的成员保存这里的数…
数值的比较就是大于.小于.等于.大于等于.小于等于.不等于,它们的运算结果都是布尔值.大于.小于.等于有直接对应的指令,分别是Cgt.Clt.Ceq.大于等于.小于等于.不等于没有直接对应的指令,它的运算实现一般是取反. 大于.小于.等于需要两个参数,它们的通用步骤1.生成加载左边变量2.生成加载右边变量3.生成比较运算指令 生成等于比较的代码实例: ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldarg_1); ilG…