关键词:
一、创建class
用MethodBuilder的DefineType方法,可以指定父类,得到一个TypeBuilder对象。
二、实现继承接口
用TypeBuilder的AddInterfaceImplementation方法。
三、显示方法重写
用TypeBuilder的DefineMethodOverride方法。
完整代码如下:
using System; using System.Reflection; using System.Reflection.Emit; namespace LX1_ILDemo class Demo31_Class static string binaryName = "Demo31_Class.dll"; static string namespaceName = "LX1_ILDemo"; static string typeName = "DemoClass"; static AssemblyBuilder assemblyBuilder; static ModuleBuilder moduleBuilder; static TypeBuilder typeBuilder; static MethodBuilder compareToMethod; public static void Generate() InitAssembly(); typeBuilder = moduleBuilder.DefineType( namespaceName + "." + typeName, TypeAttributes.Public , typeof(object) ); typeBuilder.AddInterfaceImplementation(typeof( System.IComparable)); GenerateCompareTo(); typeBuilder.DefineMethodOverride(compareToMethod, typeof(System.IComparable).GetMethod("CompareTo", new Type[] typeof(object) )); SaveAssembly(); Console.WriteLine("生成成功"); static void GenerateCompareTo() compareToMethod = typeBuilder.DefineMethod("CompareTo", MethodAttributes.Public | MethodAttributes.Virtual, typeof(int), new Type[] typeof(object) ); ILGenerator ilGenerator = compareToMethod.GetILGenerator(); ilGenerator.Emit( OpCodes.Ldc_I4_0 ); ilGenerator.Emit(OpCodes.Ret); static void InitAssembly() AssemblyName assemblyName = new AssemblyName(namespaceName); assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName); static void SaveAssembly() Type t = typeBuilder.CreateType(); //完成Type,这是必须的 assemblyBuilder.Save(binaryName);
msil实用指南-闭包的生成和调用(代码片段)
闭包(Closure)是词法闭包(LexicalClosure)的简称。对闭包的具体定义有很多种说法,这些说法大体可以分为两类:一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变... 查看详情
msil实用指南-比较运算(代码片段)
数值的比较就是大于、小于、等于、大于等于、小于等于、不等于,它们的运算结果都是布尔值。大于、小于、等于有直接对应的指令,分别是Cgt、Clt、Ceq。大于等于、小于等于、不等于没有直接对应的指令,它的运算实现一般... 查看详情
msil实用指南-字段的加载和保存(代码片段)
字段有静态字段和非静态字段之分,它们的加载保存指令也是不一样的,并且非静态字段要生成this。静态字段的加载加载静态字段的指令是Ldsfld。ilGenerator.Emit(OpCodes.Ldsfld,<FieldBuilder>);实际例子ilGenerator.Emit(OpCodes.Ldsfld,are... 查看详情
msil实用指南-局部变量的声明保存和加载(代码片段)
这一篇讲解方法内的局部变量是怎么声明、怎样保存、怎样加载的。声明局部变量声明用ILGenerator的DeclareLocal方法,参数是局部变量的数据类型,得到一个局部变量对应的创建类LocalBuilder。使用格式是LocalBuilderlocalBuilderx=ilGenerator... 查看详情
msil实用指南-方法的调用(代码片段)
方法调用指令主要有Call和Callvirt。调用static或sealed修饰的方法,用Call指令。调用virtual或abstract修饰的方法,用Callvirt指令。代码实例:ilGenerator.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",newType[]typeof(int))); 查看详情
msil实用指南-创建方法和定义参数(代码片段)
本篇讲解实现创建方法、指定参数的名称、实现参数加out和ref修饰符、以及参数加默认值。创建方法创建方法用类TypeAttributes的DefineMethod(stringname,MethodAttributesattributes,TypereturnType,Type[]parameterTypes)方法,返回结果是MethodBuilder,... 查看详情
msil实用指南-返回结果(代码片段)
一个方法体执行完指令后,必须要完成调用并返回,这是要使用Ret指令。Ret指令的详细解释是从当前方法返回,并将返回值(如果存在)从被调用方的计算堆栈推送到调用方的计算堆栈上。就是说如果计算堆栈上没有变量,则返... 查看详情
msil实用指南-加载nullstringlongfloatdouble等值(代码片段)
本篇讲述怎么加载null、string值、long值、float值、double值。加载null不需要参数值,只要Emitldnull其它几个命令要Emit<指令><值> 加载null加载null是很简单的,使用OpCodes.Ldnull,以下一句程序就可以了。ilGenerator.Emit(OpCodes.Ld... 查看详情
msil实用指南-数据类型转换
一、类的强制转换1.转换成某个类用Castclass指令。实例代码:ilGenerator.Emit(OpCodes.Castclass,typeof(ClassA));2.转换成某个值类型用Unbox_Any指令。实例代码:ilGenerator.Emit(OpCodes.Unbox_Any,typeof(DateTime));ilGenerator.Emit(OpCodes.Unbox_Any 查看详情
msil实用指南-生成for语句
for语句格式是这样的for(<初始化语句>;<条件语句>;<自增减语句>) <循环体>它可以转换为while语句if(<条件语句>) <初始化语句> while(<条件语句>) <循环体> <自增减语句> 那么就可以按照这while... 查看详情
msil静态类在il定义上和非静态类的差别(代码片段)
...,给一个C#的类标记了static之后和标记static之前,生成这个类的IL代码有什么不同如以下的代码是一个默认的控制台程序classProgramstaticvoidMain(string[]args)此时生成的IL代码,大概如下.classprivateautoansibeforefieldinitKakawbai 查看详情
javassist使用指南(代码片段)
目录一、快速入门1.1创建class文件1.2ClassPool的相关方法1.3CtClass的相关方法1.4CtMethod的相关方法1.5调用生成的类对象1.5.1通过反射调用1.5.2通过接口调用1.6修改现有的类对象二、将类冻结三、类搜索路径四、$开头的特殊字符五、Proxy... 查看详情
javascriptyui配置实用程序指南(代码片段)
sdc设计约束——时钟相关约束(代码片段)
...与时序分析的设计约束——Synopsys设计约束(SDC)实用指南文章目录SDC设计约束(1)——时钟相关约束一.时钟1.1creat_clock(创建时钟)1.2虚拟时钟二.生成时钟2.1creat_generated_clock(时钟分频 查看详情
javassist使用指南(代码片段)
目录一、快速入门1.1创建class文件1.2ClassPool的相关方法1.3CtClass的相关方法1.4CtMethod的相关方法1.5调用生成的类对象1.5.1通过反射调用1.5.2通过接口调用1.6修改现有的类对象二、将类冻结三、类搜索路径四、$开头的特殊字符五、Proxy... 查看详情
mfc中的cstring类使用方法指南(代码片段)
MFC中的CString类使用方法指南 原文出处:codeproject:CStringManagement【禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助。我们在MFC中使用字符串的相关操作,首先想到的就应该啊是CString,而不是char*或者string。... 查看详情
shgreg的伟大指南:包,库,实用程序和工具(代码片段)
mybaitsplus---mp代码生成器使用指南(代码片段)
MP代码生成器使用指南1)简介2)MP的代码生成器和MybatisMBG代码生成器的对比3)表及字段命名策略选择1.使用添加依赖2.生成器代码关于服务层自动注入建议去看官方文档进行相关配置,链接如下1)简介MP提供... 查看详情