O que eu quero fazer é mudar a forma como um método C # é executado quando chamado, para que eu possa escrever algo assim:
[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;
}
Em tempo de execução, preciso ser capaz de analisar métodos que tenham o atributo Distribuído (o que já posso fazer) e inserir o código antes que o corpo da função seja executado e depois que a função retornar. Mais importante, eu preciso ser capaz de fazer isso sem modificar o código onde Solve é chamado ou no início da função (em tempo de compilação; fazer isso em tempo de execução é o objetivo).
No momento, tentei este trecho de código (suponha que t seja o tipo em que Solve está armazenado e m é um MethodInfo de 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;
}
No entanto, MethodRental.SwapMethodBody funciona apenas em módulos dinâmicos; não aqueles que já foram compilados e armazenados na montagem.
Portanto, estou procurando uma maneira de fazer SwapMethodBody com eficácia em um método que já está armazenado em um assembly carregado e em execução .
Observe, não é um problema se eu tiver que copiar completamente o método em um módulo dinâmico, mas, neste caso, preciso encontrar uma maneira de copiar através do IL, bem como atualizar todas as chamadas para Solve () de forma que elas apontaria para a nova cópia.