Jak przechwycić wywołanie do metody niewirtualnej z / do bibliotek stron trzecich w .Net?

Myślę, że to, czego potrzebuję, to coś, co ludzie z .net nazywają „przezroczystym dynamicznym proxy”, ale wszystkie implementacje, które widziałem do tej pory (Castle DynamicProxy, Spring.NET AOP itp.) Wymagają ode mnie co najmniej jednego z nich:

Zadeklaruj przechwyconą metodę jako wirtualnąZawijaj klasę i twórz instancje opakowania zamiast klasy opakowanejZmień interfejsy dziedziczenia lub implementacji

Oczywiście, jeśli zarówno wywołujący, jak i wywołujący są niewirtualni, a z bibliotek z zamkniętymi źródłami spragnionymi, co jest prawdą, nic nie mogę zrobić.

Gdyby C # był językiem dynamicznym, takim jak Python, zrobiłbym coś takiego:

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

Potrzebuję tego, aby zmienić złe zachowanie ThirdyPartyLibA.Foo podczas interakcji z ThirdyPartyLibB.Bar. Wiem dokładnie, co powoduje to zachowanie i dokładnie, jak zmienić Foo lub Bar, aby naprawić ten błąd dzięki dezasemblerom.

Niektóre (bardzo mało prawdopodobne) pomysły:

Rozmontuj ThirdyPartyLibA, wprowadź zmiany w kodzie i wygeneruj zgodny zespół (mało prawdopodobne, aby działał, ponieważ jest to zespół o silnej nazwie)Edytuj plik binarny, aby wirtualne metody Foo były błędne i zmień wszystko, co jest konieczne, aby pozostało poprawnym zestawem, dzięki czemu mogę korzystać z dynamicznych serwerów proxy (mało prawdopodobne, aby działały, również z tego samego powodu, co powyższy pomysł)Znajdź przezroczystą implementację dynamicznego proxy, która pasuje (myślę, że nie ma żadnej na podstawie tego wątku na forum:http://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-emit-t2605695.html)Skontaktuj się z firmą, która utworzyła bibliotekę (nie obsługują już tego produktu)Przestań korzystać z biblioteki lub skorzystaj z alternatywy (niemożliwe, ponieważ jest to część środowiska RADE IDE, z którym jesteśmy związani, ponieważ istnieje OGROMNA ilość kodu napisanego przy użyciu własnego języka IDE)Kontroluj wywołania problematycznych metod, aby uniknąć błędu (już to zrobiliśmy, ale nie rozwiązało to całkowicie problemu)

Czy masz jakiś inny pomysł?

PS: Przepraszam za mój zły angielski. Przepraszam również za mojego Pythona. Ten kod jest tutaj tylko po to, aby zilustrować to, czego potrzebuję, nie bierz tego za przepis, ponieważ jest okropny.

questionAnswers(2)

yourAnswerToTheQuestion