Abfangen eines Aufrufs einer nicht virtuellen Methode von / an Bibliotheken von Drittanbietern in .Net

Ich denke, was ich brauche, ist etwas, was die .net-Leute als "transparenten dynamischen Proxy" bezeichnen, aber alle Implementierungen, die ich bisher gesehen habe (Castle DynamicProxy, Spring.NET AOP usw.), erfordern, dass ich mindestens eine der folgenden Aktionen durchführe:

Deklarieren Sie die abgefangene Methode als virtuellWrappen Sie die Klasse und erstellen Sie Instanzen des Wrappers anstelle der umschlossenen KlasseVererbung ändern oder Schnittstellen implementieren

Wenn sowohl Anrufer als auch Angerufene nicht virtuell sind und aus geschlossenen Quellbibliotheken von Drittanbietern stammen, was der Fall ist, kann ich natürlich nichts tun.

Wenn C # eine dynamische Sprache wie Python wäre, würde ich so etwas tun:

foo = ThirdyPartyLibA.Foo()
def interceptor(self, *args, **kwargs):
    do_something_before(self, *args, **kwargs)
    result = ThirdyPartyLibB.Bar.intercepted(self, *args, **kwargs)
    do_something_after(self, result, *args, **kwargs)
    return result
foo.bar.intercepted = interceptor # bar is an instance of ThirdyPartyLibB.Bar
foo.do_its_job() # Foo.do_its_job calls Bar.intercepted

Ich brauche dies, um ein schlechtes Verhalten von ThirdyPartyLibA.Foo während der Interaktion mit ThirdyPartyLibB.Bar zu ändern. Ich weiß genau, was dieses Verhalten verursacht und wie man Foo oder Bar ändert, um diesen Fehler dank Dissasemblern zu beheben.

Einige (sehr unwahrscheinliche) Ideen:

Zerlegen Sie ThirdyPartyLibA, nehmen Sie Änderungen im Code vor und generieren Sie eine kompatible Assembly (funktioniert wahrscheinlich nicht, da es sich um eine Assembly mit starkem Namen handelt).Bearbeiten Sie die Binärdatei, um die fehlerhaften Methoden von Foo virtuell zu machen, und ändern Sie alle erforderlichen Elemente, um eine gültige Assembly zu erhalten, sodass ich dynamische Proxys verwenden kann (sehr unwahrscheinlich, auch aus dem gleichen Grund wie oben).Finden Sie eine transparente dynamische Proxy-Implementierung, die passt (ich denke, es gibt keine auf diesem Forum-Thread basiert:http://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-emit-t2605695.html)Wenden Sie sich an die Firma, die die Bibliothek erstellt hat (sie unterstützt das Produkt nicht mehr).Stoppen Sie die Verwendung der Bibliothek oder verwenden Sie eine Alternative (unmöglich, da dies Teil der Laufzeit einer RAD-IDE ist, an die wir gebunden sind, da eine RIESIGE Menge an Code in der IDE-eigenen Sprache geschrieben wurde).Kontrollieren Sie die Aufrufe der problematischen Methoden, um den Fehler zu vermeiden (wir haben dies bereits getan, aber das Problem wurde nicht vollständig gelöst).

Hast du eine andere Idee?

PS: Entschuldigung für mein schlechtes Englisch. Tut mir auch leid für meinen Python. Dieser Code ist hier, um zu veranschaulichen, was ich brauche. Nimm ihn nicht als Rezept, weil er schrecklich ist.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage