msil实用指南-类相关生成(代码片段)

TKT2016 TKT2016     2022-11-04     575

关键词:

一、创建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);
        
    
View Code

 






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提供... 查看详情