Skip to content

Instantly share code, notes, and snippets.

@sn-0w
Last active October 5, 2021 19:36
Show Gist options
  • Select an option

  • Save sn-0w/67e6d2b6c5e5c3453db9ce92db616147 to your computer and use it in GitHub Desktop.

Select an option

Save sn-0w/67e6d2b6c5e5c3453db9ce92db616147 to your computer and use it in GitHub Desktop.
delegate thing idk
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