Título más o menos lo dice todo. Sobre la base de this artículo, me he llegado con esto:Cómo inyectar IL en un método en tiempo de ejecución
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();
}
Esto funciona realmente ... de vez en cuando -.-
Por ejemplo, esto funciona.
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");
}
}
Sin embargo, esto no (SEHException). Todo lo que hice fue cambiar el orden en que se definieron las funciones.
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");
}
}
En cuanto al código en el artículo ... No pude conseguir que funcione en absoluto.
¿Alguna idea/alternativa?
¿Por qué quieres hacer esto? Esto suena como una idea horrible. – Amy
No se preocupe, nada malicioso. Solo por el conocimiento: D – YellPika
Creo que la única forma segura de hacerlo es inyectar el código antes de que se cargue el ensamblaje. – porges