反射-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

转载于:https://www.cnblogs.com/whl4835349/p/9277665.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值