我想要做的是改变 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;
}
在运行时,我需要能够分析具有分布式属性的方法(我已经可以这样做了) ,然后在函数体执行之前和函数返回之后插入代码。更重要的是,我需要能够在不修改调用 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;
}
但是,MethodRent.SwapMethodBody 只能在动态模块上工作,而不能在已经编译并存储在程序集中的模块上工作。
因此,我正在寻找一种有效地在 已存储在已加载并正在执行的程序集中的上执行 SwapMethodBody 的方法。
注意,如果我必须将方法完全复制到一个动态模块中,这不是问题,但是在这种情况下,我需要找到一种方法来跨 IL 进行复制,并更新 Solve ()的所有调用,以便它们指向新的副本。