Ce que je veux faire, c'est modifier la façon dont une méthode C# s'exécute lorsqu'elle est appelée, de sorte que je puisse écrire quelque chose comme ceci :
[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;
}
Au moment de l'exécution, je dois pouvoir analyser les méthodes qui ont l'attribut Distribué (ce que je peux déjà faire) et insérer du code avant l'exécution du corps de la fonction et après le retour de la fonction. Plus important encore, je dois pouvoir le faire sans modifier le code à l'endroit où Solve est appelé ou au début de la fonction (au moment de la compilation ; l'objectif est de le faire au moment de l'exécution).
Pour l'instant, j'ai essayé ce bout de code (en supposant que t est le type dans lequel Solve est stocké, et que m est 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;
}
Cependant, MethodRental.SwapMethodBody ne fonctionne que sur les modules dynamiques, et non sur ceux qui ont déjà été compilés et stockés dans l'assemblage.
Je cherche donc un moyen d'effectuer efficacement l'opération SwapMethodBody sur un fichier qui est déjà stockée dans un assemblage chargé et en cours d'exécution .
Notez que ce n'est pas un problème si je dois copier complètement la méthode dans un module dynamique, mais dans ce cas, je dois trouver un moyen de copier l'IL ainsi que de mettre à jour tous les appels à Solve() afin qu'ils pointent vers la nouvelle copie.