3

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

我发现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); 
    }
}
4

0 回答 0