当前位置: 首页 > 编程语言 > C#

如何拦截-.Net中第三方库非虚方法的调用?Share

时间:2023-04-10 19:20:07 C#

如何拦截/.Net中第三方库的非虚拟方法的调用?我认为我需要的是.net人员所说的“透明动态代理”,但到目前为止我看到的所有实现(CastleDynamicProxy、Spring.NETAOP等)都要求我至少执行以下操作之一:将拦截将方法声明为虚拟包装类并创建包装器的实例而不是包装类更改继承或实现接口显然,如果调用者和被调用者都是非虚拟的并且来自3rdpartyclosed源库,那就没办法了。如果C#是像Python这样的动态语言,我会这样做:foo=ThirdyPartyLibA.Foo()definterceptor(self,*args,**kwargs):do_something_before(self,*args,**kwargs)result=ThirdyPartyLibB.Bar.intercepted(self,*args,**kwargs)do_something_after(self,result,*args,**kwargs)returnresultfoo.bar.intercepted=interceptor#bar是ThirdyPartyLibB.Bar的一个实例foo.do_its_job()#Foo.do_its_job调用Bar.intercepted我需要这个来改变ThirdPartyLibA.Foo在与ThirdPartyLibB.Bar交互时的不良行为。感谢反汇编者,我确切地知道是什么导致了这种行为以及如何更改Foo或Bar来修复这个错误。一些(不太可能奏效的)想法:你还有其他想法吗?PS:抱歉我的英语不好。另外,对不起我的蟒蛇。这段代码只是为了说明我需要什么,不要将它用作食谱,因为它太可怕了。可能的解决方案1:包装库并使用ReSharper等工具查找库的所有用法并替换为包装类。您还可以利用这个机会清理第三方库可能有问题的接口。可能的场景2:虽然TypeMock经常被用作测试工具,但它可以让你模拟一切。因为它将自己注入代码分析器,所以您可以模拟的东西包括类的私有成员和静态成员。作为奖励,任何重写的方法都不需要是虚拟的,因此您可以通过这种方式拦截调用。我的建议我建议你使用解决方案1。包装器很容易理解,它会给你一个很好的机会来真正改进你的代码。我什至建议您将第三方库包装为一般规则。如果Bar是静态的,您可以使用Moles来绕过方法调用。请注意,这是一种非常激进的修复错误的方法,实际上不推荐用于生产代码,但如果你绝望的话,这是一个选择。以上就是C#学习教程:如何拦截/.Net中第三方库的非虚方法的调用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: