有没有办法像我在C++中处理非托管函数那样在C#中挂接托管函数?在C++中,我会获取函数的地址,覆盖前几个字节,跳转到我的函数,做一些事情,恢复原始字节,然后调用原始函数。我可以在C#中做这样的事情吗?.NETProfilerAPI是最接近于“Microsoft批准的”在运行时拦截方法的方式。如前所述,这有点难以实现,而且我不知道有哪个库可以使用纯托管代码轻松地做到这一点。几个月前我自己研究这个选项时,偶然发现了CLR方法注入,本文的源代码解释了如何在运行时拦截方法。我考虑过自己使用它,甚至让示例项目运行,但最终得出结论,我需要的不仅仅是方法拦截,还有一个不同的解决方案。但是,这种方法直接回答了您的问题。最后,我最终做的是开发Afterthought作为PostSharp的开源替代品,PostSharp作为编译后步骤运行,允许您修改现有方法以调用其他代码,或完全替换方法实现。我现在正在研究一种新的流畅语法,现在我将提供一个示例来提供一个示例,以帮助您了解这种AOP方法如何满足您的需求:Methods.Named("Sum").WithParams()。Before((Tinstance,refint[]values)=>{vars=newStopwatch();s.Start();returns;}).After((instance,stopwatch,values)=>instance.Result=(int)stopwatch.ElapsedMilliseconds);在这种情况下,当使用Sum方法修改现有类型时,我在方法前后引入了代码来测量执行时间。在原始编译类上运行Afterthought后,生成的Sum方法将在方法体前后调用这些lambda表达式(C#编译器将它们转换为静态方法)。我可以轻松调用Implement并替换整个方法实现。我希望其中一种方法能够满足您的需要。在我的例子中,我选择了AOP路线,因为我想做的不仅仅是拦截,比如实现接口、添加新方法/属性等。我还想要一些在运行时不引入依赖性或关注稳定性或性能的东西。运行时环境——编译时处理更安全,更容易测试。你想在运行时挂钩还是修补二进制文件?要在运行时挂钩,您可以使用分析api(相对困难):http://msdn.microsoft.com/en-us/magazine/cc188743.aspx要在编译时挂钩,您可以使用IL重写器,例如PostSharp。您正在寻找的技术称为AOP-AspectOrientedProgramming。如果稍微调整一下,您可以找到几个C#框架。更新:您可以在这个问题中找到大量链接和信息:Built-inAOPinC#-isitaworkinprogress?以上是C#学习教程:有没有办法像在C++中使用非托管函数一样,在C#中hook托管函数?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
