使用DynamicMethod注入运行时代码?

The*_*ler 5 c# reflection.emit code-injection dynamicmethod opentk

请考虑以下简单代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的是将一些调试代码注入到Foo委托中,这相当于:

FooDelegate Foo = delegate(int i)
{
    try
    {
        DebugPrologue();
        return FooImplementation(i);
    }
    finally
    {
        DebugEpilogue();
    }
};
Run Code Online (Sandbox Code Playgroud)

扭曲的是我必须能够在运行时执行此操作,因此编译时和后处理方法是不可能的.

我的初始方法使用Delegate.Combine()将序言和结尾方法添加到Foo委托.唉,这不会起作用,因为它会回报价值.

我目前的想法是使用System.Reflection.Emit和DynamicMethod作为潜在的解决方案.据我所知,我需要为FooImplementation获取MethodInfo,获取它的MethodBody,将其转换为DynamicMethod并将try-finally块注入其中.

不幸的是,我完全不知道该怎么做.谁愿意伸出援助之手?或者你有另一个(最好更简单)的想法?

编辑:这里的用例是调试OpenGL绑定(http://www.opentk.com).我们必须注入2226种具有完全不同参数的方法,因此需要采用一般方法.

The*_*ler 0

我最终做的是使用 Mono.Cecil 实现我自己的重写解决方案。简单,快速,而且效果很好。不幸的是,这必须作为构建后事件来完成,因此这实际上不是运行时代码注入。