本篇讲解实现创建方法.指定参数的名称.实现参数加out和ref修饰符.以及参数加默认值. 创建方法 创建方法用类TypeAttributes的 DefineMethod(string name, MethodAttributes attributes, Type returnType, Type[] parameterTypes) 方法,返回结果是MethodBuilder,就可以创普通方法. 例子 MethodBuilder m2 = typeBuilder.DefineMethod("M2&…
本篇讲解怎么创建字段,主要是在修饰符的创建上. 创建字段的方法是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 + ".…
本篇讲解怎么加载和保存参数,以及参数起始序号的确定. 参数的加载加载参数的指令是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实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有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"…
本篇讲解怎么生成属性,包括get和set方法. 第一步,生成一个字段生成字段用TypeBuilder.DefineField方法.实例代码: FieldBuilder customerNameBldr = typeBuilder.DefineField ("_CustomerName",typeof(string),FieldAttributes.Private); 第二步,创建一个PropertyBuilder对象创建PropertyBuilder对象需要用生成字段用方法TypeBu…
C#编程中可以给字段.方法.类以及程序集加特性即继承于Attribute的类.这里讲解怎么在IL中给它们加上特性. 生成字段的对应的类是FieldBuilder,生成属性的对应的类是PropertyBuilder,生成方法的对应的类是MethodBuilder,生成类型的对应的类是TypeBuilder,生成程序集的对应的类是AssemblyBuilder.这些类都有一个共同的方法SetCustomAttribute,而且参数都是一样的,具体是SetCustomAttribute(CustomA…
方法调用指令主要有Call和Callvirt. 调用static或sealed修饰的方法,用Call指令. 调用virtual或abstract修饰的方法,用Callvirt指令. 代码实例: ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int)}));…
闭包(Closure)是词法闭包(Lexical Closure)的简称.对闭包的具体定义有很多种说法,这些说法大体可以分为两类: 一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变量(注1)的函数.另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体.比如参考资源中就有这样的的定义:在实现深约束(注2)时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包.这两种定义在某种意义上是对立的,…