สิ่งที่ฉันต้องการทำคือเปลี่ยนวิธีการดำเนินการของ 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 (ซึ่งฉันทำได้อยู่แล้ว) จากนั้นใส่โค้ดก่อนที่เนื้อหาของฟังก์ชันจะดำเนินการและหลังจากที่ฟังก์ชันกลับมา ที่สำคัญกว่านั้นคือฉันต้องสามารถทำได้โดยไม่ต้องแก้ไขโค้ดที่มีการเรียกใช้การแก้ปัญหาหรือเมื่อเริ่มต้นฟังก์ชัน (ในเวลาคอมไพล์การทำเช่นนั้นในเวลาทำงานเป็นวัตถุประสงค์)
ในขณะนี้ฉันได้ลองใช้บิตของโค้ดนี้แล้ว(สมมติว่า t เป็นประเภทที่มีการแก้ปัญหาและ m คือ 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 ตลอดจนอัปเดตการเรียกทั้งหมดเพื่อแก้ไข () เพื่อให้ จะชี้ไปที่สำเนาใหม่