내가 원하는 것은 호출 될 때 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 특성이있는 메서드 (이미 수행 할 수 있음)를 분석 한 다음 함수 본문이 실행되기 전과 함수가 반환 된 후에 코드를 삽입 할 수 있어야합니다. 더 중요한 것은 Solve가 호출되는 코드를 수정하거나 함수가 시작될 때 (컴파일 타임에, 런타임에 그렇게하는 것이 목표 임) 코드를 수정하지 않고 수행 할 수 있어야한다는 것입니다.
현재이 코드를 시도했습니다 (t는 Solve가 저장된 유형이고 m은 Solve의 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을 통해 복사하는 방법을 찾고 Solve ()에 대한 모든 호출을 업데이트하여 새 사본을 가리킬 것입니다.