一、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

反射-Emit的更多相关文章

  1. IoC原理-使用反射/Emit来实现一个最简单的IoC容器

    从Unity到Spring.Net,到Ninject,几年来陆陆续续用过几个IoC框架.虽然会用,但也没有一直仔细的研究过IoC实现的过程.最近花了点时间,下了Ninject的源码,研究了一番,颇有收 ...

  2. 含有ref out 参数 的方法反射 Emit 与 普通

    反射中很多朋友应该屡屡被带有ref out参数的方法折腾 当使用正常反射一个方法时候: 代码如下调用一个后期绑定方法MakeByRefType 就行了 MemberInfo test = typeof ...

  3. .NET(C#):分析IL中的if-else,while和for语句并用Emit实现

    这是一篇关于IL和反射Emit的文章(所以不喜欢IL或者Emit的就没必要往下看了),要求读者对IL和Emit工作原理较了解.所有分析IL均在Visual Studio 2010 SP1下编译生成.( ...

  4. Deep Clone 常用方式总结

    Deep Clone Example 总结 Deep Clone 一般有如下几种实现方式: 纯手工每个类实现赋值 (ps: 不做介绍,一般都不想这么玩) 序列化和反序列化 纯反射 emit 或 Exp ...

  5. [翻译] .NET Standard 2.1 公布

    [翻译] .NET Standard 2.1 公布 原文: Announcing .NET Standard 2.1 校对: Cloud 自从大约一年前发布 .NET Standard 2.0以来,我 ...

  6. C#中反射的使用(How to use reflect in CSharp)(3)Emit的使用

    Emit意在动态构建一个可以执行(当然也就可以反射)或者只可以反射的动态库. 个人认为在不得不使用反射的情况下,使用Emit会使得效率提升空间很大.亦或者动态插件模式的软件设计中会用到. 依然2%的废 ...

  7. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  8. 再看ExpressionTree,Emit,反射创建对象性能对比

    [前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ...

  9. 什么是Emit,什么是反射,二者区别到底是什么?(转)

    Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘 ...

随机推荐

  1. winfrom里面打印类似小票

    首先在窗体上拖一个printDocument1控件和一个Button按钮,然后双击该控件的PrintPage事件,在事件里面复制下面代码: Pen blackPen = new Pen(Color.B ...

  2. python基础--压缩文件

    1)怎么压缩备份多个文件 使用zipfile 创建压缩文件 查看信息 解压缩 # 创建 import zipfile # os.chdir('test') my_zip = zipfile.ZipFi ...

  3. 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言

    自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增.且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移 ...

  4. Swift 学习- 01 -- 基础部分

    print("世界,你好") var myVariable = 42 myVariable = 50 let myConstant = 42 let implicitinteger ...

  5. Connection reset by [server_ip] port 22 (hexo d 部署博客出错)

    问题 在使用 hexo d 部署博客和使用 Git/Github 进行 git push -u origin master 时遇到了以下问题: git -c diff.mnemonicprefix=f ...

  6. Confluence 6 配置 Web 代理支持

    这个页面中的相关平台中的内容是不被支持的.因此,Atlassian 支持不能保证能够为你提供任何支持.请注意,这个页面下面提供的信息仅为你提供参考同时也不能保证所有的的配置能正常工作.如果你按照本页面 ...

  7. vivado 下安装modelsim

    安装modelsim 下载链接:http://pan.baidu.com/s/1i4vHDbR 密码:dksy 1.运行modelsim-win64-10.4-se.exe,安装软件: 注意事项:安装 ...

  8. LeetCode(73):矩阵置零

    Medium! 题目描述: 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1], ...

  9. 简单的做一个图片上传预览(web前端)

    转载:点击查看原文 在做web项目很多的时候图片都是避免不了的,所以操作图片就成了一个相对比较棘手的问题,其实也不是说很麻烦,只是说上传然后直接预览的过程很恶心,今天简单的做一个处理. 效果预览: & ...

  10. Axure实现多用户注册验证

    *****多用户登录验证***** 一.(常规想法)方法:工作量较大,做起来繁琐 1.当用户名和密码相同时怎么区分两者,使用冒号和括号来区分: eg. (admin:123456)(123456:de ...