Что я хочу сделать, так это изменить способ выполнения метода 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 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;
}
Однако, MethodRental.SwapMethodBody работает толькона динамических модулях;не те, которые уже были скомпилированы и сохранены в сборке.
Поэтому я ищу способ эффективного выполнения SwapMethodBody для метода, который уже хранится в загруженной и выполняемой сборке .
Обратите внимание: если мне нужно полностью скопировать метод в динамический модуль, это не проблема, но в этом случае мне нужно найти способ копирования через IL, а также обновить все вызовы.Решить () так, чтобы они указывали на новую копию.