string sumStr = sum.ToString(); 14 15 Console.WriteLine(sumStr); 16 } 17 } 对应的 ILGenerator.Emit SetValueMethod", null, new Type[] { /*typeof(object), typeof(object)*/ }, true); 36 37 ILGenerator 13 } 14 15 public class TestClass 16 { 17 public int Age; 18 } 对应的 ILGenerator.Emit SetValueMethod", null, new Type[] { /*typeof(object), typeof(object)*/ }, true); 28 29 ILGenerator
ilGenerator = method.GetILGenerator(); 6: ilGenerator.Emit(OpCodes.Ldarg_0); 7: ilGenerator.Emit ilGenerator = method.GetILGenerator(); 7: ilGenerator.Emit(OpCodes.Ldarg_0); 8: ilGenerator.EmitCall ilGenerator = methodBuilder.GetILGenerator(); 24: ilGenerator.Emit(OpCodes.Ldarg_0); 25: ilGenerator.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null); 26: ilGenerator.Emit(OpCodes.Ret = methodBuilder.GetILGenerator(); 31: ilGenerator.Emit(OpCodes.Ldarg_0); 32: ilGenerator.Emit
ilGenerator = method.GetILGenerator(); 6: ilGenerator.DeclareLocal(typeof(object)); 7: ilGenerator.Emit(OpCodes.Ldarg_0); 8: ilGenerator.Emit(OpCodes.Castclass, this.TargetType); : ilGenerator.Emit(OpCodes.Stloc_0); 15: ilGenerator.Emit(OpCodes.Ldloc_0); 16: ilGenerator.Emit ParameterType; 7: ilGenerator.DeclareLocal(paramType); 8: ilGenerator.Emit(OpCodes.Ldarg _0); 9: ilGenerator.Emit(OpCodes.Castclass, this.TargetType); 10: ilGenerator.Emit(OpCodes.Ldarg
= methodBuilder.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit (OpCodes.Ldstr, propertyName); ilGenerator.Emit(OpCodes.Call, getProperty); ilGenerator.Emit = methodBuilder.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit if (propertyType.IsValueType) ilGenerator.Emit(OpCodes.Box, propertyType); ilGenerator.Emit(OpCodes.Call, setProperty); ilGenerator.Emit(OpCodes.Ret); } 在上面的
= dynamicMethod.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit (OpCodes.Ldarg_1); ilGenerator.EmitCall(OpCodes.Call, SetValueMethod, null); ilGenerator.Emit dynamicMethod = new DynamicMethod("GetValue", typeof(int), new[] { typeof(A) }, typeof(A)); var ilGenerator = dynamicMethod.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.EmitCall (OpCodes.Call, GetValueMethod, null); ilGenerator.Emit(OpCodes.Ret); return (Func<A, int
tb.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, parameterTypes); ILGenerator tb.DefineConstructor( MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes); ILGenerator mbNumberGetAccessor = tb.DefineMethod( "get_Number", getSetAttr, typeof(int), Type.EmptyTypes); ILGenerator mbNumberSetAccessor = tb.DefineMethod( "set_Number", getSetAttr, null, new Type[] { typeof(int) }); ILGenerator tb.DefineMethod( "MyMethod", MethodAttributes.Public, typeof(int), new Type[] { typeof(int) }); ILGenerator
) vararg methods are not supported void InvokeSuperMethod(IMethod, MethodInvocationExpression) void ILGenerator.EmitCall (OpCode, MethodInfo, Type[]) vararg methods are not supported void EmitUnbox(IType) void ILGenerator.EmitCall : void EmitCreateDelegateInstance(ILGenerator, Type, MethodInfo) void ILGenerator.EmitCall(OpCode, MethodInfo , Type[]) vararg methods are not supported Class NHibernate.Property.BasicGetter: void Emit(ILGenerator ) void ILGenerator.EmitCall(OpCode, MethodInfo, Type[]) vararg methods are not supported NLog.dll Methods
MethodAttributes.Public, CallingConventions.Standard, parameterTypes); Emit动态生成构造函数 //中间语言的生成者 ILGenerator typebuilder.DefineMethod("ConsoleMethod", MethodAttributes.Public | MethodAttributes.Static, null, null); ILGenerator MethodAttributes.Public | MethodAttributes.Static, typeof(int), new Type[] { typeof(int), typeof(int) }); ILGenerator
iLGenerator = dyn.GetILGenerator(); iLGenerator.EmitWriteLine("HelloWorld"); iLGenerator.Emit(OpCodes.Ret); dyn.Invoke(null,null); 运行后会打印字符串。 ILGenerator 是 IL 代码生成器。 EmitWriteLine 作用是打印字符串, OpCodes.Ret 标记 结束方法的执行, Invoke 将方法转为委托执行。 ILGenerator 正是使用 C# 代码的形式去写 IL,但是所有过程都必须按照 IL 的步骤去写。 ilCode = dynamicMethod.GetILGenerator(); DynamicMethod 用于定义一个方法;ILGenerator是 IL 生成器。
(System.Reflection.Emit) Defining a Parameter with Reflection Emit c# - How to set “.maxstack” with ILGenerator - Stack Overflow 生成方法体 ILGenerator.DefineLabel Method (System.Reflection.Emit) ILGenerator.MarkLabel - Stack Overflow ILGenerator.Emit Method ILGenerator.Emit Method (System.Reflection.Emit) ILGenerator.Emit Method (OpCode, String) (System.Reflection.Emit) ILGenerator.Emit Method (OpCode, MethodInfo) (System.Reflection.Emit ) ILGenerator.EmitCall Method (OpCode, MethodInfo, Type[]) (System.Reflection.Emit) .net - Call and Callvirt
定义方法名,返回类型,输入类型 var method = new DynamicMethod("Main", null, Type.EmptyTypes); 3、生成IL代码 //生成IL代码 var ilGenerator = method.GetILGenerator(); ilGenerator.Emit(OpCodes.Nop); ilGenerator.Emit(OpCodes.Ldstr,"Hello World ; ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) } )); //寻找Console的WriteLine方法 ilGenerator.Emit(OpCodes.Nop); ilGenerator.Emit(OpCodes.Ret); 4、创建委托并调用 /
object), new Type[] { typeof(object), typeof(object[]) }, methodInfo.DeclaringType.Module); ILGenerator FastInvokeHandler)); return invoder; } privatestaticvoid EmitCastToReference(ILGenerator il.Emit(OpCodes.Castclass, type); } } privatestaticvoid EmitBoxIfNeeded(ILGenerator il.Emit(OpCodes.Box, type); } } privatestaticvoid EmitFastInt(ILGenerator
但是定义方法后需要写方法内的代码,这时需要使用 ILGenerator ,使用他的 Emit 方法,这个方法的速度很快,使用的时候需要知道 IL 的,如果不知道,没关系,我接下来会仔细说。 ILGenerator generator = dynamicMethod.GetILGenerator(); 需要获得类型的所有属性,虽然这里用了反射,但是只是用一次,因为这里用反射获得方法是在写IL var dynamicMethod = new DynamicMethod("Clone", null, new[] { typeof(T), typeof(T) }); ILGenerator _cachedIL.TryGetValue(typeof(T), out myExec)) { // Create ILGenerator ConstructorInfo cInfo = myObject.GetType().GetConstructor(new Type[] { }); ILGenerator
但是定义方法后需要写方法内的代码,这时需要使用 ILGenerator ,使用他的 Emit 方法,这个方法的速度很快,使用的时候需要知道 IL 的,如果不知道,没关系,我接下来会仔细说。 ILGenerator generator = dynamicMethod.GetILGenerator(); 需要获得类型的所有属性,虽然这里用了反射,但是只是用一次,因为这里用反射获得方法是在写IL var dynamicMethod = new DynamicMethod("Clone", null, new[] { typeof(T), typeof(T) }); ILGenerator _cachedIL.TryGetValue(typeof(T), out myExec)) { // Create ILGenerator ConstructorInfo cInfo = myObject.GetType().GetConstructor(new Type[] { }); ILGenerator
tb.DefineMethod(string.Format("get_{0}", propertyNm), getSetAttr, type, Type.EmptyTypes); 73 ILGenerator setAccessor.DefineParameter(1, ParameterAttributes.None, "value"); 87 ILGenerator
(System.Reflection.Emit) Defining a Parameter with Reflection Emit c# - How to set “.maxstack” with ILGenerator - Stack Overflow 生成方法体 ILGenerator.DefineLabel Method (System.Reflection.Emit) ILGenerator.MarkLabel
DynamicMethod("CglibProxy", typeof(T), Type.EmptyTypes, typeof(ProxyGenerator).Module); var ilGenerator = dynamicMethod.GetILGenerator(); // Create a new instance of the target class ilGenerator.Emit GetConstructor(Type.EmptyTypes)); // Return the new instance as the result of the method ilGenerator.Emit
object), assembly.GetType("FireFarEvent.FarEventArgs") }, this.GetType()); ILGenerator
instance void Employee::.ctor() IL_0005: ret 你可以访问这个站点,它可以很方便的把C#转换成IL代码,https://sharplab.io/[1] 然后使用 ILGenerator 最后执行该委托返回一个 Employee 对象 ConstructorInfor ctor = typeToCreate.GetConstructor(System.Type.EmptyTypes); ILGenerator "DynamicMethod", typeof(Employee), null, typeof(ReflectionBenchmarks).Module, false); ILGenerator
Attribute附加到(动态创建的)方法HelloWorld myMethodBuilder.SetCustomAttribute(myCABuilder2); ILGenerator