Como interceptar uma chamada para um método não-virtual de / para bibliotecas de terceiros em .Net?

Eu acho que o que eu preciso é algo que as pessoas do .net chamam de "proxy dinâmico transparente", mas todas as implementações que eu vi até agora (Castle DynamicProxy, Spring.NET AOP, etc) exigem que eu faça pelo menos um destes:

Declarar o método interceptado como virtualQuebrar a classe e criar instâncias do wrapper em vez da classe envolvidaAlterar as interfaces de herança ou implemento

Obviamente, se o chamador e o receptor não são virtuais e de bibliotecas de código-fonte fechado de terceiros, o que é o caso, não há nada que eu possa fazer.

Se C # fosse uma linguagem dinâmica como o Python eu faria algo assim:

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

Eu preciso disso para alterar um mau comportamento do ThirdyPartyLibA.Foo ao interagir com o ThirdyPartyLibB.Bar. Eu sei exatamente o que causa esse comportamento e exatamente como alterar Foo ou Bar para corrigir esse bug graças aos dissasemblers.

Algumas ideias (muito improváveis ​​de trabalhar):

Desmonte o ThirdyPartyLibA, faça alterações no código e gere um assembly compatível (é improvável que funcione porque é um assembly de nome forte)Edite o binário para tornar os métodos de bugs do Foo virtuais e altere o que for necessário para que ele permaneça como um assembly válido para que eu possa usar proxies dinâmicos (é muito improvável que funcione, também pelo mesmo motivo da ideia acima)Encontre uma implementação de proxy dinâmico transparente que se encaixe (acho que não há nenhuma baseada neste tópico do fórum:http://www.pcreview.co.uk/forums/overriding-non-virtual-methods-using-il-and-reflection-emit-t2605695.html)Entre em contato com a empresa que criou a biblioteca (eles não suportam mais o produto)Pare de usar a biblioteca ou use uma alternativa (impossível, já que é parte do tempo de execução de um RAD IDE ao qual estamos ligados, pois há uma enorme quantidade de código escrito usando o próprio idioma do IDE)Controlar as chamadas para os métodos problemáticos para evitar o bug (nós já fizemos isso, mas não resolveu o problema completamente)

Você tem alguma outra ideia?

PS: Desculpe pelo meu inglês ruim. Além disso, desculpe pelo meu Python. Este código está aqui apenas para ilustrar o que eu preciso, não tome isso como uma receita porque é horrível.

questionAnswers(2)

yourAnswerToTheQuestion