private MethodBuilder CreateMethodProxy(MethodBuilder context, DynamicMethod target) { TypeBuilder tb = (TypeBuilder)context.DeclaringType; string name = $".dmdproxy<{target.Name.Replace('.', '_')}>?{target.GetHashCode()}"; MethodBuilder mb; // System.NotSupportedException: The invoked member is not supported before the type is created. /* * mb = tb.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static) as MethodBuilder; * if (mb != null) * return mb; */ Type[] args = target.GetParameters().Select(param => param.ParameterType).ToArray(); mb = tb.DefineMethod( name, System.Reflection.MethodAttributes.HideBySig | System.Reflection.MethodAttributes.Private | System.Reflection.MethodAttributes.Static, CallingConventions.Standard, target.ReturnType, args ); ILGenerator il = mb.GetILGenerator(); // Load the DynamicMethod reference first. il.EmitReference(target); // Load any other arguments on top of that. il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Ldc_I4, args.Length); il.Emit(OpCodes.Newarr, typeof(object)); for (int i = 0; i < args.Length; i++) { il.Emit(OpCodes.Dup); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldarg, i); il.Emit(OpCodes.Stelem_Ref); } // Invoke the delegate and return its result. il.Emit(OpCodes.Callvirt, m_MethodBase_InvokeSimple); if (target.ReturnType == typeof(void)) { il.Emit(OpCodes.Pop); } else if (target.ReturnType.IsValueType) { il.Emit(OpCodes.Unbox_Any, target.ReturnType); } il.Emit(OpCodes.Ret); return(mb); }