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