2017-06-19 70 views
0

我一直在试图解决这个问题一段时间,我一直无法找到答案。 基本上,我有一个特定的方法,当被调用时,实际上执行另一个不同的方法,而不是我假定需要我修改方法指针指向的方法本身。交换方法指针

说这话时,

public class A : OtherRandomClass 
{ 
    protected void SomeMethod() 
    { 
    //code 
    } 
} 

public class B 
{ 
    public void OtherMethod() 
    { 
    //code that I want to execute when SomeMethod is called 
    } 
} 

我不能不幸修改类A的来源,但我想尝试做的是作出的someMethod任何呼叫实际调用OtherMethod而防止的someMethod本身被调用,我不想诉诸交换方法机构。

我知道这是多么糟糕的做法,但我使用的框架只是简单的愚蠢,我没有其他选择。

任何方法呢?

编辑:找到我正在寻找的,感谢任何试图帮助的人!

+3

在您控制的代码中,“SomeMethod”的所有* call网址*是否也是不可修改的?另外,你的示例方法是实例方法,'A'和'B'似乎没有任何继承关系 - 在这样的调用过程中,B的实例在哪里? –

+0

是https://stackoverflow.com/questions/25366243/intercept-method-calls的使用? – mjwills

+0

@Damien_The_Unbeliever无法真正控制任何调用SomeMethod的网站。 A和B是完全独立的类,在继承方面彼此不相关。 'B'实例将在'A'后面实例化。另外,@mjwills,我将不得不更多地考虑这一点,但看起来并不像它。 – Trivaxy

回答

0

这看起来并不简单,坦率地说,我从来没有试图做过这样的事情。

我真的想知道你的情况,因为如果你想要做的是我最后的选择,我不会使用这个程序集。

This answer建议用自己替换载入方法体(这是写在随后的中间语言),使用反射:

您可以使用MethodInfo.GetMethodBody()GetILAsByteArray(),修改 那,然后将其重新插入到MethodBuilder.CreateMethodBody()中。

然后,您可以检查this question and its answers以了解您应该如何实现这一切,但看起来像CreateMethodBody不完全受支持,并且可能会有一些意外行为。

总的来说,这是相当复杂的,并不值得麻烦。

+0

你是对的。我会给这个镜头看看结果。 – Trivaxy