Hey all. I was working on my hacking library and I came across the need to create some methods using IL. Here is a class I wrote, hopefully someone finds it useful.
The Class:
Code:
public static class DynamicMethodFactory
{
static AssemblyName assemblyName;
static AssemblyBuilder assembly;
static ModuleBuilder module;
static DynamicMethodFactory()
{
assemblyName = new AssemblyName("DynamicMethodFactory");
assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
module = assembly.DefineDynamicModule($"<Module-{Guid.NewGuid()}>");
}
public static T CreateDelegate<T>(Action<ILGenerator> generate) where T : class
{
if (!typeof(T).IsSubclassOf(typeof(Delegate)))
throw new ArgumentException("T must be a delegate type.");
var type = module.DefineType($"<Type-{Guid.NewGuid()}>");
var methodName = $"<Method-{Guid.NewGuid()}>";
var methodInfo = typeof(T).GetMethod("Invoke");
var method = type.DefineMethod(methodName, MethodAttributes.Static | MethodAttributes.Public, methodInfo.ReturnType, methodInfo.GetParameters().Select(x => x.ParameterType).ToArray());
generate(method.GetILGenerator());
type.CreateType();
return type.GetMethod(methodName).CreateDelegate(typeof(T)) as T;
}
}
Possible Use:
Code:
public static class StructHelper<T> where T : struct
{
private delegate IntPtr AddressOfDelegate(ref T value);
public static AddressOfDelegate AddressOf { get; }
static StructHelper()
{
AddressOf = DynamicMethodFactory.CreateDelegate<AddressOfDelegate>(il =>
{
il.Emit(OpCodes.Ldarg, 0);
il.Emit(OpCodes.Ret);
});
}
}