Der Titel sagt eigentlich schon alles. Basierend auf diesem Artikel, habe ich folgendes entwickelt:
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();
}
Das funktioniert tatsächlich... gelegentlich -.-
Zum Beispiel, dies funktioniert.
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("Hallo Welt");
}
public static void B()
{
Console.WriteLine("Tschüss Welt");
}
}
Jedoch funktioniert dies nicht (SEHException). Alles, was ich gemacht habe, war, die Reihenfolge zu ändern, in der die Funktionen definiert wurden.
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("Tschüss Welt");
}
public static void A()
{
Console.WriteLine("Hallo Welt");
}
}
Was den Code im Artikel betrifft... ich konnte ihn überhaupt nicht zum Laufen bringen.
Irgendwelche Ideen/Alternativen?