Chcę zmienić sposób wykonywania metody C #, gdy jest wywoływana, aby móc napisać coś takiego:
[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;
}
W czasie wykonywania muszę być w stanie analizować metody, które mają atrybut Distributed (co już mogę zrobić), a następnie wstawiać kod przed wykonaniem treści funkcji i po jej powrocie. Co ważniejsze, muszę być w stanie to zrobić bez modyfikowania kodu w miejscu wywołania funkcji Solve lub na początku funkcji (w czasie kompilacji; celem jest zrobienie tego w czasie wykonywania).
W tej chwili próbowałem tego fragmentu kodu (załóżmy, że t jest typem, w którym jest przechowywany Solve, a m to MethodInfo of 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;
}
Jednak MethodRental.SwapMethodBody działa tylko na modułach dynamicznych; nie te, które zostały już skompilowane i zapisane w zestawie.
Dlatego szukam sposobu, aby skutecznie wykonać SwapMethodBody w metodzie, która jest już przechowywana w załadowanym i wykonującym się zestawie .
Zauważ, że nie jest problemem, jeśli muszę całkowicie skopiować metodę do modułu dynamicznego, ale w tym przypadku muszę znaleźć sposób na skopiowanie przez IL, a także zaktualizować wszystkie wywołania do Solve (), tak aby były wskazywałby na nową kopię.