2017-06-19 68 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