는 다음과 같은 사소한 코드를 살펴 보자 :DynamicMethod를 사용하는 런타임 코드 삽입?
using System;
class Test
{
delegate int FooDelegate(int i);
FooDelegate Foo = FooImplementation;
static int FooImplementation(int i)
{
return i + 1;
}
public static void Main()
{
Foo(1);
}
}
내가 뭘하고 싶은 것은 동등한 것 푸 대표로 일부 디버깅 코드를 삽입입니다 :
FooDelegate Foo = delegate(int i)
{
try
{
DebugPrologue();
return FooImplementation(i);
}
finally
{
DebugEpilogue();
}
};
트위스트 내가해야한다는 것입니다 런타임에서이 작업을 수행 할 수 있으므로 컴파일 타임 및 후 처리 방법은 문제가되지 않습니다.
필자의 초기 접근 방식은 Foo 대리자에게 프롤로그 및 에필로그 메서드를 추가하기 위해 Delegate.Combine()을 사용했습니다. 슬프게도, 반환 값을 변경하지 않으므로 작동하지 않습니다.
현재 나의 생각은 System.Reflection.Emit 및 DynamicMethod를 잠재적 인 솔루션으로 사용하는 것입니다. 필자가 말할 수있는 한, FooImplementation을위한 MethodInfo를 얻고, MethodBody를 얻고, DynamicMethod로 변환하고 try-finally 블록을 삽입해야합니다.
불행히도, 나는 어떻게 이런 일을하는지 전혀 모릅니다. 핸드를 기꺼이 빌려주는 사람은 누구입니까? 아니면 다른 아이디어가 있습니까?
편집 : 여기의 유스 케이스는 OpenGL 바인딩 (http://www.opentk.com)을 디버깅하는 것입니다. 우리는 격렬하게 다른 매개 변수로 2226 방법을 주입해야하므로 일반적인 접근이 필요합니다.
당신이해야 할 노력하고 있지만, 단순히Foo
필드에서 지적 년대
FooImplementation
를 리디렉션 않다면 어떤
이 솔루션은 삽입 할 수있는 많은 방법에 대해 완벽하게 작동합니다. 불행히도,이 특정 경우에 난 격렬하게 다른 매개 변수를 2226 메서드를 주입해야합니다 (이것은 OpenGL 바인딩입니다,이를 반영하기 위해 원래 질문을 업데이트 할 것입니다). –