Lo que quiero hacer es cambiar la forma en que se ejecuta un método de C # cuando se llama, para poder escribir algo como esto:
[Distributed]
public DTask<bool> Solve(int n, DEvent<bool> callback)
{
for (int m = 2; m < n - 1; m += 1)
if (m % n == 0)
return false;
return true;
}
En tiempo de ejecución, necesito poder analizar métodos que tienen el atributo Distribuido (lo cual ya puedo hacer) y luego insertar código antes de que se ejecute el cuerpo de la función y después de que la función regrese. Más importante aún, necesito poder hacerlo sin modificar el código donde se llama a Solve o al comienzo de la función (en tiempo de compilación; hacerlo en tiempo de ejecución es el objetivo).
Por el momento, he intentado este bit de código (suponga que t es el tipo en el que está almacenado Solve y m es un MethodInfo de Solve) :
private void WrapMethod(Type t, MethodInfo m)
{
// Generate ILasm for delegate.
byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray();
// Pin the bytes in the garbage collection.
GCHandle h = GCHandle.Alloc((object)il, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
int size = il.Length;
// Swap the method.
MethodRental.SwapMethodBody(t, m.MetadataToken, addr, size, MethodRental.JitImmediate);
}
public DTask<bool> ReplacedSolve(int n, DEvent<bool> callback)
{
Console.WriteLine("This was executed instead!");
return true;
}
Sin embargo, MethodRental.SwapMethodBody solo funciona en módulos dinámicos; no los que ya se han compilado y almacenado en el ensamblaje.
Así que estoy buscando una manera de hacer SwapMethodBody de manera efectiva en un método que ya está almacenado en un ensamblado cargado y en ejecución .
Tenga en cuenta que no es un problema si tengo que copiar completamente el método en un módulo dinámico, pero en este caso necesito encontrar una manera de copiar a través de IL, así como actualizar todas las llamadas a Solve () de modo que apuntaría a la nueva copia.