Il titolo dice più o meno tutto. Sulla base di this articolo, mi è venuta in mente questo:Come iniettare IL in un metodo in fase di esecuzione
public static unsafe void Replace(this MethodBase destination, MethodBase source)
{
IntPtr srcHandle = source.MethodHandle.GetFunctionPointer();
IntPtr dstHandle = destination.MethodHandle.GetFunctionPointer();
int* dstPtr = (int*)dstHandle.ToPointer();
*dstPtr = srcHandle.ToInt32();
}
Questo funziona davvero ... di tanto in tanto -.-
Ad esempio, questo funziona.
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void A()
{
Console.WriteLine("Hai World");
}
public static void B()
{
Console.WriteLine("Bai World");
}
}
Tuttavia, questo non (SEHException). Tutto ciò che ho fatto è stato modificare l'ordine in cui sono state definite le funzioni.
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void B()
{
Console.WriteLine("Bai World");
}
public static void A()
{
Console.WriteLine("Hai World");
}
}
Per quanto riguarda il codice nell'articolo ... non riuscivo a farlo funzionare affatto.
Qualche idea/alternative?
Perché vuoi farlo? Sembra un'idea orribile. – Amy
Non preoccuparti, niente di malevolo. Solo per motivi di conoscenza: D – YellPika
Credo che l'unico modo sicuro per fare ciò sia iniettare il codice prima che l'assembly sia caricato. – porges