一、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来完成类型的创建。
这样一个完整的类就算完成了。但为了能用reflector查看我们创建的动态程序集,我们选择将这个程序集保存下来。
如前面定义模块时所说,这里文件名字必须和模块保存到的文件一致,否则我们前面定义的模块和这个模块的一切就无家可归了。接下来,(如果在定义模块时未指定动态创建的程序要保存到哪个目录)我们就可以到 Debug目录下看看生成的Main.dll了,用Reflector打开可以看到:
三、不包含main的控制台程序
一直以来,应用程序(控制台,winform)都是从Main函数启动的,如果没有Main还能启动吗?答案是可以,下面就用emit来做这样一个控制台程序,完整代码如下:
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