我想做的是更改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是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()的所有调用的方法。将指向新副本。