MSIL实用指南-创建对象】的更多相关文章

创建对象用Newobj指令,它的操作是创建一个新的对象或值类型,并将对象引用的新实例到计算堆栈上.格式是Newobj <构造函数>实例: ilGenerator.Emit(OpCodes.Newobj, typeof(Uri).GetConstructor(new Type[] { typeof(string)})); 在调用Newobj指令前,需要加载构造函数所需要的参数. 完整程序如下: using System; using System.Reflection; using System…
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"…
我们学习编程开始时,一般用输出"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…
这一篇讲解怎么加载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位有符号…
这一篇讲解方法内的局部变量是怎么声明.怎样保存.怎样加载的. 声明局部变量声明用ILGenerator的DeclareLocal方法,参数是局部变量的数据类型,得到一个局部变量对应的创建类LocalBuilder.使用格式是LocalBuilder localBuilderx = ilGenerator.DeclareLocal(typeof(<数据类型>));实际例子 LocalBuilder localBuilderv1 = ilGenerator.DeclareLocal(typeof(…
本篇讲解怎么创建字段,主要是在修饰符的创建上. 创建字段的方法是TypeBuilder.DefineField,传入字段名称.字段类型.字段修饰符等参数,返回一个FieldBuilder对象.先看这一句程序 FieldBuilder nameFieldBuilder = typeBuilder.DefineField("Name", typeof(string), FieldAttributes.Private); 上面一条程序是创建一个叫"Name"的数据类型为&…
创建枚举类型比较简单,主要使用moduleBuilder.DefineEnum 和enumBuilder.DefineLiteral. 第一步:创建 EnumBuilder 创建 EnumBuilder用moduleBuilder.DefineEnum方法,参数是(<枚举类型名称>,<访问控制符>,<类型>)具体例子是这样 EnumBuilder enumBuilder = moduleBuilder.DefineEnum(namespaceName + ".…
本篇讲解实现创建方法.指定参数的名称.实现参数加out和ref修饰符.以及参数加默认值. 创建方法 创建方法用类TypeAttributes的 DefineMethod(string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) 方法,返回结果是MethodBuilder,就可以创普通方法. 例子 MethodBuilder m2 = typeBuilder.DefineMethod("M2&…