[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;
}
在运行时,我需要能够分析具有分布式属性的方法(这一点我已经可以做到),然后在函数体执行之前和函数返回之后插入代码。更重要的是,我需要在不修改调用 Solve 的代码或在函数开始处(在编译时这样做;在运行时完成是目标)的情况下实现它。
目前,我尝试了这段代码(假设 t 是存储 Solve 的类型,m 是 Solve 的 MethodInfo):
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,并更新所有调用Solve()的地方,使它们指向新的副本。