Yapmak istediğim şey, bir C # yönteminin çağrıldığında nasıl çalışacağını değiştirmektir, böylece şöyle bir şey yazabilirim:
[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;
}
Çalışma zamanında, Dağıtılmış özniteliğine (zaten yapabildiğim) sahip yöntemleri analiz edebilmem ve ardından işlevin gövdesi çalıştırılmadan önce ve işlev döndükten sonra kod ekleyebilmem gerekiyor. Daha da önemlisi, Solve'nin çağrıldığı yerde veya işlevin başlangıcında (derleme zamanında; bunu çalışma zamanında yapmak amaçtır) kodu değiştirmeden yapabilmem gerekiyor.
Şu anda bu kod parçasını denedim (t'nin Solve'da depolandığı tür olduğunu ve m'nin Çözme'nin MethodInfo olduğunu varsayın) :
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;
}
Ancak, MethodRental.SwapMethodBody yalnızca dinamik modüller üzerinde çalışır; montajda önceden derlenmiş ve saklanmış olanlar değil.
Bu yüzden, SwapMethodBody'yi zaten yüklenmiş ve çalıştırılan bir derlemede depolanan bir yöntemde etkili bir şekilde yapmanın bir yolunu arıyorum .
Yöntemi tamamen dinamik bir modüle kopyalamam gerekip gerekmediğini unutmayın, ancak bu durumda IL genelinde kopyalama yapmanın bir yolunu bulmam ve Solve () 'e yapılan tüm çağrıları, yeni kopyayı gösterir.