Điều tôi muốn làm là thay đổi cách một phương thức C # thực thi khi nó được gọi, để tôi có thể viết một cái gì đó như sau:
[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;
}
Tại thời điểm chạy, tôi cần có khả năng phân tích các phương thức có thuộc tính Phân tán (mà tôi đã có thể làm) và sau đó chèn mã trước khi phần thân của hàm thực thi và sau khi hàm trả về. Quan trọng hơn, tôi cần có thể làm điều đó mà không cần sửa đổi mã nơi Solve được gọi hoặc khi bắt đầu hàm (tại thời điểm biên dịch; làm như vậy trong thời gian chạy là mục tiêu).
Hiện tại, tôi đã thử bit mã này (giả sử t là kiểu Solve được lưu trữ và m là MethodInfo của 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;
}
Tuy nhiên, MethodRental.SwapMethodBody chỉ hoạt động trên các mô-đun động; không phải những cái đã được biên dịch và lưu trữ trong assembly.
Vì vậy, tôi đang tìm cách để thực hiện SwapMethodBody một cách hiệu quả trên một phương thức đã được lưu trữ trong một assembly được tải và đang thực thi .
Lưu ý, sẽ không thành vấn đề nếu tôi phải sao chép hoàn toàn phương thức vào mô-đun động, nhưng trong trường hợp này, tôi cần tìm cách sao chép trên IL cũng như cập nhật tất cả các lệnh gọi tới Solve () sao cho chúng sẽ trỏ đến bản sao mới.