vendredi 16 juin 2017

Replace (and backup) Method dynamically in C#

I need to change a specific property dynamically and have been using this snipplet:

var _oldMethod = typeof(TypeName).GetProperty("OldProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
var _newMethod = typeof(OwnTypeName).GetProperty("NewProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
ReplaceMethod(_oldMethod, _newMethod);

...

private static unsafe void ReplaceMethod(MethodInfo _oldMethod, MethodInfo _newMethod)
{
    var _oldMethodAddress = new IntPtr((int*)_oldMethod.MethodHandle.Value.ToPointer() + 2);
    var _destination = (uint*)_oldMethodAddress.ToPointer();
    *destination = (uint)_newMethod.MethodHandle.GetFunctionPointer().ToInt32();
}

Unfortunately this required some decompiling with recreating the original property. What I am looking for now is a a possibility to duplicate and kind of backup the original method and dynamically replace the old method with the new one or restore the original one.

Has anyone an idea how to implement this?





Aucun commentaire:

Enregistrer un commentaire