【问题标题】:Replace (and backup) Method dynamically in C#在 C# 中动态替换(和备份)方法
【发布时间】:2017-06-16 16:34:30
【问题描述】:

我需要动态更改一个特定的属性并且一直在使用这个snipplet:

var _oldMethod = typeof(TypeName).GetProperty("OldProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
var _newMethod = typeof(OwnTypeName).GetProperty("NewProperty", BindingFlags.Public | BindingFlags.Static).GetMethod;
ReplaceMethod(_oldMethod, _newMethod);

...

private static unsafe void ReplaceMethod(MethodInfo _oldMethod, MethodInfo _newMethod)
{
    var _oldMethodAddress = new IntPtr((int*)_oldMethod.MethodHandle.Value.ToPointer() + 2);
    var _destination = (uint*)_oldMethodAddress.ToPointer();
    *destination = (uint)_newMethod.MethodHandle.GetFunctionPointer().ToInt32();
}

不幸的是,这需要通过重新创建原始属性进行一些反编译。我现在正在寻找的是一种复制和备份原始方法并用新方法动态替换旧方法或恢复原始方法的可能性。

有人知道如何实现吗?

编辑: 我可能应该进一步澄清我的情况:

public static class ClassName
{
    public static bool Property
    {
      get
      {
        // Conditions
      }
    }
}

我无法访问ClassName,需要在特定情况下强制Property为false,在其他情况下需要将其替换为原始返回值。我一直在使用上面提到的 ReplaceMethod,但不想从头开始反编译和重建属性(而不是原始属性的某种备份)

【问题讨论】:

  • 你能告诉我们你为什么要这样做的背景吗?
  • 仅供参考,在 64 位机器上,IntPtr 不适合 uint
  • 添加了更多信息
  • Funny 会问你是否可以访问ClassName,因为如果你这样做了,还有更好的方法。我认为您还需要其他无法访问的课程也可以从您的黑客中受益吗?如果没有,您可以使用垫片。

标签: c# methods reflection replace


【解决方案1】:

首先,您处理的是属性而不是方法。

一种简单的方法是用 Func 替换您的属性类型,这将使​​您想要做的事情更容易。

private static void Main(string[] args)
{
    var a = new A();

    a.Property = Method1;
    Console.WriteLine(a.Property.Invoke());

    a.Property = Method2;
    Console.WriteLine(a.Property.Invoke());

    Func<string> oldMethod = a.Property;
    Console.WriteLine(oldMethod.Invoke());

    Console.ReadLine();
}

public class A
{
    public Func<string> Property { get; set; }
}

private static string Method1()
{
    return "Method1";
}

private static string Method2()
{
    return "Method2";
}

您可以根据需要多次更改方法,还可以保留旧的一对一变量。

【讨论】:

  • 属性类型为普通bool,无法访问class(如Edit中所写)
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多