使用Reflection交换方法实现(相同的签名)?

时间:2016-03-11 00:30:59

标签: c# reflection runtime jit method-swizzling

我必须在封闭源库中增加一些方法。我正在寻找一些非常简单的方法来交换两个静态方法的实现(具有完全相同的签名)。

我找到了MethodRental.SwapMethodBody,我非常喜欢,但是如果没有深入了解底层运行时,我几乎只是猜测如何使用它。

有人可以修改下面这段代码吗? 或者提出一种完全不同的方法?

using System;
using System.Reflection;
using System.Reflection.Emit;

public class Example
{
    // This should be replaced (swapped)...
    static string OriginalMethod(string a, string b)
    { return string.Format("a={0}; b={1};", a, b); }

    // ...with this.
    static string NewMethod(string a, string b)
    { return string.Format("`a` is `{0}` and b is `{1}`.", a, b); }

    void Swap()
    {
        System.Type type = typeof(Example);

        // Original.
        MethodInfo originalMethod = type.GetMethod("OriginalMethod");
        MethodToken originalMethodToken = // How to obtain this ???

        // New.
        MethodInfo newMethod = type.GetMethod("NewMethod");
        IntPtr newMethodPointer = newMethod.MethodHandle.GetFunctionPointer();
        int methodByteSize = newMethod.GetMethodBody().GetILAsByteArray().Length;

        // Swap.
        MethodRental.SwapMethodBody(
            type, 
            originalMethodToken.Token, 
            newMethodPointer,
            methodByteSize,
            MethodRental.JitImmediate); 
    }
}

0 个答案:

没有答案