Yang ingin saya lakukan adalah mengubah cara metode C # dijalankan ketika dipanggil, sehingga saya dapat menulis sesuatu seperti ini:
[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;
}
Pada waktu proses, saya harus dapat menganalisis metode yang memiliki atribut Terdistribusi (yang sudah dapat saya lakukan) dan kemudian memasukkan kode sebelum badan fungsi dijalankan dan setelah fungsi kembali. Lebih penting lagi, saya harus dapat melakukannya tanpa memodifikasi kode di mana Solve dipanggil atau di awal fungsi (pada waktu kompilasi; tujuannya adalah melakukannya saat run-time).
Saat ini saya telah mencoba sedikit kode ini (asumsikan t adalah tipe tempat penyimpanan Solve, dan m adalah MethodInfo of 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;
}
Namun, MethodRental.SwapMethodBody hanya bekerja pada modul dinamis; bukan yang sudah dikompilasi dan disimpan di assembly.
Jadi saya mencari cara untuk secara efektif melakukan SwapMethodBody dengan metode yang sudah disimpan dalam rakitan yang dimuat dan dijalankan .
Catatan, ini bukan masalah jika saya harus menyalin sepenuhnya metode ke dalam modul dinamis, tetapi dalam kasus ini saya perlu menemukan cara untuk menyalin di IL serta memperbarui semua panggilan ke Solve () sehingga mereka akan mengarah ke salinan baru.