根据MSDN MethodRental Class允许更改动态模块的方法体。但是由于它的局限性,我无法想到它的实际用法。谷歌也没有帮助我。
任何想法可以用于什么类?
答案 0 :(得分:6)
不确定您的意思是什么。显然,这只适用于MethodBuilder生成的动态生成方法。从程序集加载的IL编译的JIT类方法无法替换。
用例将实现动态语言的运行时,该语言支持更改已定义类的方法(猴子修补)。 Ruby,Python,Javascript等语言。
答案 1 :(得分:6)
与ICorProfilerCallback::JITCompilationStarted
配对时,这与ICorProfilerInfo::SetILFunctionBody
的精神相似,但约束更多。 ICorProfiler*
类可用于为几乎任何托管方法执行运行时检测。有分析器和调试器使用它们来收集有关正在运行的进程的信息。
您可以使用MethodRental
来检测代码以进行诊断。一些例子:
您还可以使用MethodRental
来增强现有代码的功能。我想起了Aspect-oriented programming。您可以将安全性,日志记录或其他横切设计问题“编织”到现有代码中。但是,这需要一些其他工具(XML,一个C#库)来表达你的方面。
最后,您可以使用MethodRental
来“绕道”现有代码,即拦截方法调用以创建一种运行时多态性。例如,如果您的客户端代码使用一些动态生成的类RegistryStore
来通过GetConfig
进行一些配置,那么您可以重写方法的IL以更改RegistryStore.GetConfig
的实现以使用而是文件系统。您无需更改客户端代码即可完成此操作。