zoukankan      html  css  js  c++  java
  • 反射-Emit

    一、Emit

    Emit,可以称为发出或者产出。在Framework中,与Emit相关的类基本都存在与System.Reflection,Emit命名空间下。可见Emit是作为反射的一个元素存在,反射可以查看程序集的元数据,获取程序集包含哪些类型,类型包含哪些方法等,但是反射只能“看”,Emit可以在运行时动态生成代码(IL),.net就可以执行。反射主要用到对象已经存在的情况下,而反射发出主要用到对象并不存在等情况下(而利用代码动态的构建对象)。

    二、动态生成代码(IL代码)

    1.构建程序集

    var as = new AssemblyName("TEST");

    //AssemblyBuilderAccess.RunAndSave 表示动态程序集会被保存至磁盘并能立即执行。

    var  asmBuilder=AppDomain.CurrentDomain.DefineDynamicAssembly(asmName,AssemblyBuilderAccess.RunAndSave);

    AssemblyBuilderAccess,ReflectionOnly;

    2.创建模块

    var mdlBldr = asmBuilder.DefineDynamicModult("Main","Main.dll");

    3.定义类

    var typeBldr=mdlBldr.DefineType("Hello",TypeAttributes.Public);

    4.定义类成员

    var  methodBldr = typeBldr.DefineMethod(

    "SayHello",

    MethodAttributes.Public,

    null,//返回类型

    null//参数类型

    )

    方法的原型即为 SayHello

    Console.WriteLine("Hello World");

    var i = methodBldr.GetILGenerator();//获取IL生成器

    il.Emit(OpCodes.Ldstr,"Hello, World"); 
    il.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)})); 
    il.Emit(OpCodes.Ret);

      OpCodes枚举定义了所有可能的操作,这里用到了:

      ldStr:加载一个字符串到evaluation stack。

      Call:调用方法。

      Ret:返回,当evaluation stack有值时会返回栈顶值。

      完成上面的步骤,一个类型好像就已经完成了。事实上却还没有,最后我们还必须显示的调用CreateType来完成类型的创建。

    typeBldr.CreateType();

      这样一个完整的类就算完成了。但为了能用reflector查看我们创建的动态程序集,我们选择将这个程序集保存下来。

    asmBuilder.Save("Main.dll");

       如前面定义模块时所说,这里文件名字必须和模块保存到的文件一致,否则我们前面定义的模块和这个模块的一切就无家可归了。接下来,(如果在定义模块时未指定动态创建的程序要保存到哪个目录)我们就可以到 Debug目录下看看生成的Main.dll了,用Reflector打开可以看到:

      三、不包含main的控制台程序

      一直以来,应用程序(控制台,winform)都是从Main函数启动的,如果没有Main还能启动吗?答案是可以,下面就用emit来做这样一个控制台程序,完整代码如下:

    var asmName = new AssemblyName("Test"); 
    var asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( 
    asmName, 
    AssemblyBuilderAccess.RunAndSave); 
    var mdlBldr = asmBuilder.DefineDynamicModule("Main", "Main.exe"); 
    var typeBldr = mdlBldr.DefineType("Hello", TypeAttributes.Public); 
    var methodBldr = typeBldr.DefineMethod( 
    "SayHello", 
    MethodAttributes.Public | MethodAttributes.Static, 
    null,//return type 
    null//parameter type 
    ); 
    var il = methodBldr.GetILGenerator();//获取il生成器 
    il.Emit(OpCodes.Ldstr,"Hello, World"); 
    il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)})); 
    il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine")); 
    il.Emit(OpCodes.Pop);//读入的值会被推送至evaluation stack,而本方法是没有返回值的,因此,需要将栈上的值抛弃 
    il.Emit(OpCodes.Ret); 
    var t = typeBldr.CreateType(); 
    asmBuilder.SetEntryPoint(t.GetMethod("SayHello")); 
    asmBuilder.Save("Main.exe");

    运行生成的Main.exe效果如下:

     例

                #region
                //得到当前的应用程序域
                AppDomain app = AppDomain.CurrentDomain;
                //初始化AssemblyName的一个实例
                AssemblyName an = new AssemblyName("EmitLearn");
                //设置程序集的名称
                //  an.Name = "EmitLearn";
                //动态的在当前应用程序域创建一个应用程序集
                AssemblyBuilder a = app.DefineDynamicAssembly(an, System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave);
                //动态在程序集内创建一个模块
                ModuleBuilder mb = a.DefineDynamicModule("EmitLearn", "HelloEmit.dll");
                //动态的在模块内创建一个类
                TypeBuilder tb = mb.DefineType("HelloEmit", TypeAttributes.Public | TypeAttributes.Class);
                //动态的为类里创建一个方法
                MethodBuilder mdb = tb.DefineMethod("SayHelloEmit", MethodAttributes.Public, null, new Type[] { typeof(string) });
    
                //得到该方法的iLGenerator
                ILGenerator il = mdb.GetILGenerator();
                il.Emit(OpCodes.Ldstr, "你好");
                //加载传入方法的参数的堆栈
                il.Emit(OpCodes.Ldarg_0);
    
                il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
                il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
                //没有返回值所有加Pop
                il.Emit(OpCodes.Pop);
                il.Emit(OpCodes.Ret);
                //创建类的Type对象
                Type tp = tb.CreateType();
                a.Save("HelloEmit.dll");
                //实例化一个类
                object ob = Activator.CreateInstance(tp);
                //得到类中的方法,通过Invoke来触发方法的调用
                MethodInfo mdth = tp.GetMethod("SayHelloEmit");
                //mdth.Invoke(ob, null);
                mdth.Invoke(ob, new object[] { "摩天大楼" });
                #endregion

    了解完Emit的基本概念后就应该实际动手操作一下了,就像C#代码一样Emit代码也不是都需要理解的,复杂的逻辑当然需要理解,但是像string str=”abc”;这样的就不用深究了吧,知道这是干嘛的就行了。 
    没有了解过Emit和IL的朋友请先看看下面两篇文章: 
    Emit基本概念介绍:http://blog.csdn.net/xiaouncle/article/details/52621815 
    轻松读懂IL:http://blog.csdn.net/xiaouncle/article/details/52770462

    【无返回值】无参方法SayHello()

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null);
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //没有返回值所有加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点2】
        methodInfo.Invoke(obj, null); 
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public void SayHello()
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【无返回值】静态无参方法SayHello()

    Emit代码:

    static void Main(string[] args)
    {            
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, null);
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //没有返回值所有加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点2】
        methodInfo.Invoke(obj, null);  
     }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public static void SayHello()
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【无返回值】含参方法SayHello(string name)

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, new Type[] { typeof(string) });
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "你好:{0}");
        //【不同点2】
        ilOfSayHello.Emit(OpCodes.Ldarg_1);
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //没有返回值所有加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点3】
        methodInfo.Invoke(obj, new object[] { "蝈蝈" }); 
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public void SayHello(string text1)
        {
            Console.WriteLine("你好:{0}", text1);
            Console.ReadLine();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【无返回值】静态含参方法SayHello(string name)

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, null, new Type[] { typeof(string) });
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "你好:{0}");
        //【不同点2】
        ilOfSayHello.Emit(OpCodes.Ldarg_0);
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //没有返回值所有加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点3】
        methodInfo.Invoke(obj, new object[] { "蝈蝈" }); 
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public static void SayHello(string text1)
        {
            Console.WriteLine("你好:{0}", text1);
            Console.ReadLine();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【有返回值】无参方法SayHello()

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, typeof(string), null);
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //为什么加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        //返回值部分
        LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string));
        ilOfSayHello.Emit(OpCodes.Ldstr, "返回值");
        ilOfSayHello.Emit(OpCodes.Stloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ldloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点2】
        object result = methodInfo.Invoke(obj, null);
        Console.WriteLine("result=" + result.ToString());
        Console.ReadKey();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public string SayHello()
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
            return "返回值";
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【有返回值】静态无参方法SayHello()

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, typeof(string), null);
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //为什么加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        //返回值部分
        LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string));
        ilOfSayHello.Emit(OpCodes.Ldstr, "返回值");
        ilOfSayHello.Emit(OpCodes.Stloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ldloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点2】
        object result = methodInfo.Invoke(obj, null);
        Console.WriteLine("result=" + result.ToString());
        Console.ReadKey();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public static string SayHello()
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
            return "返回值";
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【有返回值】含参方法SayHello(string name)

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, typeof(string), new Type[] { typeof(string) });
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //为什么加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        //返回值部分
        LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string));
        ilOfSayHello.Emit(OpCodes.Ldstr, "99999{0}");
        //【不同点2】
        ilOfSayHello.Emit(OpCodes.Ldarg_1);
        ilOfSayHello.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Stloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ldloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点3】
        object result = methodInfo.Invoke(obj, new object[] { "蝈蝈" });
        Console.WriteLine("result=" + result.ToString());
        Console.ReadKey();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public string SayHello(string text1)
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
            return string.Format("99999{0}", text1);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【有返回值】静态含参方法SayHello(string name)

    Emit代码:

    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("assemblyName");
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
        //*【不同点1】
        MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public | MethodAttributes.Static, typeof(string), new Type[] { typeof(string) });
        ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
        ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
        //为什么加OpCodes.Pop
        ilOfSayHello.Emit(OpCodes.Pop);
        //返回值部分
        LocalBuilder local = ilOfSayHello.DeclareLocal(typeof(string));
        ilOfSayHello.Emit(OpCodes.Ldstr, "99999{0}");
        //【不同点2】
        ilOfSayHello.Emit(OpCodes.Ldarg_0);
        ilOfSayHello.Emit(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(string) }));
        ilOfSayHello.Emit(OpCodes.Stloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ldloc_0, local);
        ilOfSayHello.Emit(OpCodes.Ret);
        Type personType = typeBuilder.CreateType();
        assemblyBuilder.Save("Person.dll");
        object obj = Activator.CreateInstance(personType);
        MethodInfo methodInfo = personType.GetMethod("SayHello");
        //【不同点3】
        object result = methodInfo.Invoke(obj, new object[] { "蝈蝈" });
        Console.WriteLine("result=" + result.ToString());
        Console.ReadKey();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    .Net Reflector转换后代码:

    public class Person
    {
        // Methods
        public static string SayHello(string text1)
        {
            Console.WriteLine("蝈蝈");
            Console.ReadLine();
            return string.Format("99999{0}", text1);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实例代码免费下载地址:http://download.csdn.net/detail/xiaouncle/9649675 
    .Net Reflector Version 9.0.1.374 带注册机免费下载地址: http://download.csdn.net/detail/xiaouncle/9649783

    原:https://blog.csdn.net/xiaouncle/article/details/52776007

    111111
  • 相关阅读:
    web.xml+spring mvc基本配置
    REST服务安全-双向认证
    thymeleaf 配置
    jenkins
    linux下ssh/scp无密钥登陆方法
    java编译 Error: Could not find or load main class java执行包main方法
    文本按列导入excel
    linux脚本-判断进程是否存在,从而可以做预警处理..
    Linux中顿号
    >/dev/null 2>&1
  • 原文地址:https://www.cnblogs.com/whl4835349/p/9277665.html
Copyright © 2011-2022 走看看