System.Reflection.AssemblyName assemblyName = new System.Reflection.AssemblyName();
assemblyName.Name = "ABC";
AppDomain appDomain = System.Threading.Thread.GetDomain(); System.Reflection.Emit.AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, System.Reflection.Emit.AssemblyBuilderAccess.Run);
System.Reflection.Emit.ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("myModle");
System.Reflection.Emit.TypeBuilder typeBuilder = moduleBuilder.DefineType("myClass", System.Reflection.TypeAttributes.Public & System.Reflection.TypeAttributes.Class); //给class添加方法
Type ret = typeof(System.String); System.Reflection.Emit.MethodBuilder methodBuilder = typeBuilder.DefineMethod("Sum", System.Reflection.MethodAttributes.Public, ret, null);
System.Reflection.Emit.ILGenerator gen = methodBuilder.GetILGenerator();
gen.Emit(System.Reflection.Emit.OpCodes.Ldstr, "abc");
gen.Emit(System.Reflection.Emit.OpCodes.Stloc_0);
gen.Emit(System.Reflection.Emit.OpCodes.Br_S); //无条件地将控制转移到目标指令(短格式)
gen.Emit(System.Reflection.Emit.OpCodes.Ldloc_0); //将索引 0 处的局部变量加载到计算堆栈上
gen.Emit(System.Reflection.Emit.OpCodes.Ret); //从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上 Type t = typeBuilder.CreateType(); object obj = System.Activator.CreateInstance(t);
object result = t.InvokeMember("Sum", System.Reflection.BindingFlags.InvokeMethod, null, obj, null);
上面是对应
public string Sum()
{
return "abc";
}的,很简单,但总是出错,为啥咛?烦劳高手点拨开窍,感激涕零!
assemblyName.Name = "ABC";
AppDomain appDomain = System.Threading.Thread.GetDomain(); System.Reflection.Emit.AssemblyBuilder assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, System.Reflection.Emit.AssemblyBuilderAccess.Run);
System.Reflection.Emit.ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("myModle");
System.Reflection.Emit.TypeBuilder typeBuilder = moduleBuilder.DefineType("myClass", System.Reflection.TypeAttributes.Public & System.Reflection.TypeAttributes.Class); //给class添加方法
Type ret = typeof(System.String); System.Reflection.Emit.MethodBuilder methodBuilder = typeBuilder.DefineMethod("Sum", System.Reflection.MethodAttributes.Public, ret, null);
System.Reflection.Emit.ILGenerator gen = methodBuilder.GetILGenerator();
gen.Emit(System.Reflection.Emit.OpCodes.Ldstr, "abc");
gen.Emit(System.Reflection.Emit.OpCodes.Stloc_0);
gen.Emit(System.Reflection.Emit.OpCodes.Br_S); //无条件地将控制转移到目标指令(短格式)
gen.Emit(System.Reflection.Emit.OpCodes.Ldloc_0); //将索引 0 处的局部变量加载到计算堆栈上
gen.Emit(System.Reflection.Emit.OpCodes.Ret); //从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上 Type t = typeBuilder.CreateType(); object obj = System.Activator.CreateInstance(t);
object result = t.InvokeMember("Sum", System.Reflection.BindingFlags.InvokeMethod, null, obj, null);
上面是对应
public string Sum()
{
return "abc";
}的,很简单,但总是出错,为啥咛?烦劳高手点拨开窍,感激涕零!
local 0 没定义
gen.Emit(System.Reflection.Emit.OpCodes.Br_S);
没有给出装跳的目标根本不需要这么编译器式的IL,完全可以直接:
[code=MSIL]gen.Emit(System.Reflection.Emit.OpCodes.Ldstr, "abc");
gen.Emit(System.Reflection.Emit.OpCodes.Ret);[/code]