Ich möchte ändern, wie eine C # -Methode beim Aufruf ausgeführt wird, damit ich so etwas schreiben kann:
[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;
}
Zur Laufzeit muss ich in der Lage sein, Methoden mit dem Attribut Distributed zu analysieren (was ich bereits kann) und dann Code einzufügen, bevor der Hauptteil der Funktion ausgeführt wird und nachdem die Funktion zurückgegeben wird. Noch wichtiger ist, dass ich in der Lage sein muss, dies zu tun, ohne den Code zu ändern, in dem Solve aufgerufen wird, oder zu Beginn der Funktion (zur Kompilierungszeit; dies ist zur Laufzeit das Ziel).
Im Moment habe ich dieses Codebit versucht (angenommen, t ist der Typ, in dem Solve gespeichert ist, und m ist eine MethodInfo von 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;
}
MethodRental.SwapMethodBody funktioniert jedoch nur mit dynamischen Modulen. nicht diejenigen, die bereits kompiliert und in der Assembly gespeichert wurden.
Daher suche ich nach einer Möglichkeit, SwapMethodBody effektiv für eine Methode auszuführen, die bereits in einer geladenen und ausgeführten Assembly gespeichert ist .
Beachten Sie, dass es kein Problem ist, wenn ich die Methode vollständig in ein dynamisches Modul kopieren muss. In diesem Fall muss ich jedoch eine Möglichkeit finden, über die IL zu kopieren und alle Aufrufe von Solve () so zu aktualisieren, dass sie würde auf die neue Kopie verweisen.