Що я хочу зробити - це змінити спосіб виконання методу C # при його виклику, щоб я міг написати щось подібне:
[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;
}
Під час виконання роботи мені потрібно мати можливість аналізувати методи, які мають атрибут Distributed (що я вже можу зробити), а потім вставляти код до того, як тіло функції виконуватиметься і після повернення функції. Що ще важливіше, мені потрібно вміти це робити, не змінюючи код, де викликається Solve або на початку функції (під час компіляції; це робиться в час виконання).
На даний момент я спробував цей біт коду (припустимо, t - тип, в якому зберігається Solve, а m - MethodInfo 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 працює лише на динамічних модулях; не ті, які вже були складені та збережені у складі.
Тому я шукаю спосіб ефективного виконання SwapMethodBody за методом, який вже зберігається у завантаженій і виконуючій збірці .
Зауважте, це не проблема, якщо мені доведеться повністю скопіювати метод в динамічний модуль, але в цьому випадку мені потрібно знайти спосіб копіювання через ІЛ, а також оновити всі виклики Solve () таким чином, щоб вони вказував би на нову копію.