private void EmitPrivateDelegate(MethodInfo methodInfo) { var typeOfDelegate = typeof(Delegate); var localArray = ILGenerator.DeclareLocal(typeof(object[])); var parameters = methodInfo.GetParameters(); Locals.Add(localArray); ILGenerator.Emit(OpCodes.Castclass, typeOfDelegate); ILGenerator.EmitPushInteger(parameters.Length); ILGenerator.Emit(OpCodes.Newarr, TypeSystem.Object); ILGenerator.EmitStoreLocal(localArray); Node.AcceptVisitor(this, ILGenerator); ILGenerator.EmitLoadLocal(localArray); ILGenerator.Emit(OpCodes.Callvirt, typeOfDelegate.GetMethod("DynamicInvoke")); ILGenerator.Emit(OpCodes.Unbox_Any, methodInfo.ReturnType); }
private void EmitPrivate(MethodInfo methodInfo) { Type typeArrayType = typeof(Type[]); Type objectArrayType = typeof(object[]); Type methodInfoType = typeof(MethodInfo); var parameters = methodInfo.GetParameters(); var localTypeArray = ILGenerator.DeclareLocal(typeArrayType); var localObjectArray = ILGenerator.DeclareLocal(objectArrayType); var getTypeFromHandleMethod = typeof(Type).GetMethod("GetTypeFromHandle"); var invocation = methodInfoType.BaseType.GetMethod("Invoke", new Type[] { TypeSystem.Object, typeof(object[]) }); Locals.Add(localTypeArray); Locals.Add(localObjectArray); ILGenerator.Emit(OpCodes.Ldtoken, methodInfo.DeclaringType); ILGenerator.Emit(OpCodes.Call, getTypeFromHandleMethod); ILGenerator.Emit(OpCodes.Ldstr, methodInfo.Name); ILGenerator.EmitPushInteger(Convert.ToInt32(BindingFlags.NonPublic | BindingFlags.Static)); ILGenerator.Emit(OpCodes.Ldnull); ILGenerator.EmitPushInteger(parameters.Length); ILGenerator.Emit(OpCodes.Newarr, typeArrayType.GetElementType()); ILGenerator.EmitStoreLocal(localTypeArray); parameters.ForEach((p, i) => { ILGenerator.EmitLoadLocal(localTypeArray); ILGenerator.EmitPushInteger(i); ILGenerator.Emit(OpCodes.Ldtoken, p.ParameterType); ILGenerator.Emit(OpCodes.Call, getTypeFromHandleMethod); ILGenerator.Emit(OpCodes.Stelem_Ref); }); ILGenerator.EmitLoadLocal(localTypeArray); ILGenerator.Emit(OpCodes.Ldnull); ILGenerator.Emit(OpCodes.Call, typeof(Type).GetMethod("GetMethod", new Type[] { TypeSystem.String, typeof(BindingFlags), typeof(Binder), typeof(Type[]), typeof(SysReflection.ParameterModifier[]) })); ILGenerator.Emit(OpCodes.Ldnull); ILGenerator.EmitPushInteger(parameters.Length); ILGenerator.Emit(OpCodes.Newarr, TypeSystem.Object); ILGenerator.EmitStoreLocal(localObjectArray); Node.AcceptVisitor(this, ILGenerator); ILGenerator.EmitLoadLocal(localObjectArray); ILGenerator.Emit(OpCodes.Callvirt, invocation); ILGenerator.Emit(OpCodes.Unbox_Any, methodInfo.ReturnType); }