Last active
October 5, 2021 19:36
-
-
Save sn-0w/67e6d2b6c5e5c3453db9ce92db616147 to your computer and use it in GitHub Desktop.
delegate thing idk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| RuntimeTypeHandle handle1 = Program.moduleHandle.ResolveTypeHandle(1); | |
| RuntimeMethodHandle handle2 = Program.moduleHandle.ResolveMethodHandle(2); | |
| RuntimeFieldHandle handle3 = Program.moduleHandle.ResolveFieldHandle(3); | |
| FieldInfo fieldFromHandle = FieldInfo.GetFieldFromHandle(handle3); | |
| Type typeFromHandle = Type.GetTypeFromHandle(handle1); | |
| MethodInfo methodInfo = (MethodInfo)MethodBase.GetMethodFromHandle(handle2); | |
| FieldInfo fieldInfo = fieldFromHandle; | |
| Type type = typeFromHandle; | |
| MethodInfo methodInfo2 = methodInfo; | |
| Type type2 = type; | |
| FieldInfo fieldInfo2 = fieldInfo; | |
| ParameterInfo[] parameters = methodInfo2.GetParameters(); | |
| Type[] array = new Type[parameters.Length + 1]; | |
| array[0] = (methodInfo2.DeclaringType.IsValueType ? methodInfo2.DeclaringType.MakeByRefType() : typeof(object)); | |
| DynamicMethod dynamicMethod = new DynamicMethod(string.Empty, methodInfo2.ReturnType, array, type2, true); | |
| ILGenerator ilgenerator = dynamicMethod.GetILGenerator(); | |
| ilgenerator.Emit(OpCodes.Ldarg_0); | |
| int i = 0; | |
| while (i < parameters.Length + 1) | |
| { | |
| switch (i) | |
| { | |
| case 0: | |
| ilgenerator.Emit(OpCodes.Ldarg_0); | |
| break; | |
| case 1: | |
| ilgenerator.Emit(OpCodes.Ldarg_1); | |
| break; | |
| case 2: | |
| ilgenerator.Emit(OpCodes.Ldarg_2); | |
| break; | |
| case 3: | |
| ilgenerator.Emit(OpCodes.Ldarg_3); | |
| break; | |
| default: | |
| ilgenerator.Emit(OpCodes.Ldarg_S, i); | |
| break; | |
| } | |
| i++; | |
| } | |
| ilgenerator.Emit(fieldInfo2.IsAssembly ? OpCodes.Callvirt : OpCodes.Call, methodInfo2); | |
| ilgenerator.Emit(OpCodes.Ret); | |
| Delegate value = dynamicMethod.CreateDelegate(type2); | |
| fieldInfo2.SetValue(null, value); | |
| array[1] = parameters[0].ParameterType; | |
| fieldInfo2.SetValue(null, Delegate.CreateDelegate(fieldInfo2.FieldType, methodInfo2)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment