¿Cómo interceptar una llamada a un método no virtual desde / a bibliotecas de terceros en .Net?

Creo que lo que necesito es algo que la gente de .net llama "proxy dinámico transparente", pero todas las implementaciones que he visto hasta ahora (Castle DynamicProxy, Spring.NET AOP, etc.) requieren que haga al menos una de estas:

Declara el método interceptado como virtualAjustar clase y crear instancias del contenedor en lugar de clase envueltaCambiar herencia o implementar interfaces.

Obviamente, si tanto la persona que llama como la persona que llama son no virtuales y de bibliotecas de código cerrado de terceros, que es el caso, no hay nada que pueda hacer.

Si C # fuera un lenguaje dinámico como Python, haría algo como esto:

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

Necesito esto para cambiar un mal comportamiento de ThirdyPartyLibA.Foo al interactuar con ThirdyPartyLibB.Bar. Sé exactamente qué causa este comportamiento y exactamente cómo cambiar Foo o Bar para solucionar este error gracias a los desensambladores.

Algunas ideas (muy poco probable que funcionen):

Desmonte ThirdyPartyLibA, realice cambios en el código y genere un ensamblaje compatible (es poco probable que funcione porque es un ensamblaje de nombre seguro)Edite el binario para hacer que los métodos de buggy de Foo sean virtuales y cambie lo que sea necesario para que siga siendo un conjunto válido, de modo que pueda usar proxies dinámicos (es muy poco probable que funcione, también por la misma razón que la idea anterior)Encuentre una implementación de proxy dinámico transparente que se ajuste (creo que no hay ninguna basada en este hilo de foro:http://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-emit-t2605695.html)Póngase en contacto con la empresa que creó la biblioteca (ya no admiten el producto)Deje de usar la biblioteca o use una alternativa (imposible, ya que es parte del tiempo de ejecución de un IDE de RAD al que estamos vinculados porque hay una GRAN cantidad de código escrito en el propio idioma del IDE)Controle las llamadas a los métodos problemáticos para evitar el error (ya lo hicimos pero no resolvimos el problema por completo)

¿Tiene usted alguna otra idea?

PD: Perdón por mi mal inglés. Además, lo siento por mi Python. Este código está aquí solo para ilustrar lo que necesito, no lo tome como una receta porque es horrible.

Respuestas a la pregunta(2)

Su respuesta a la pregunta