MethodRental Class的实际用法?

时间:2010-05-17 09:35:58

标签: .net reflection dynamic

根据MSDN MethodRental Class允许更改动态模块的方法体。但是由于它的局限性,我无法想到它的实际用法。谷歌也没有帮助我。

任何想法可以用于什么类?

2 个答案:

答案 0 :(得分:6)

不确定您的意思是什么。显然,这只适用于MethodBuilder生成的动态生成方法。从程序集加载的IL编译的JIT类方法无法替换。

用例将实现动态语言的运行时,该语言支持更改已定义类的方法(猴子修补)。 Ruby,Python,Javascript等语言。

答案 1 :(得分:6)

ICorProfilerCallback::JITCompilationStarted配对时,这与ICorProfilerInfo::SetILFunctionBody的精神相似,但约束更多。 ICorProfiler*类可用于为几乎任何托管方法执行运行时检测。有分析器和调试器使用它们来收集有关正在运行的进程的信息。

您可以使用MethodRental来检测代码以进行诊断。一些例子:

  • 函数enter / exit将为您提供一个执行跟踪,您可以使用该跟踪从。
  • 中获取分析数据
  • 检测同步原语可以帮助您诊断竞争条件。
  • 检测基本块可以帮助您确定代码覆盖率。

您还可以使用MethodRental来增强现有代码的功能。我想起了Aspect-oriented programming。您可以将安全性,日志记录或其他横切设计问题“编织”到现有代码中。但是,这需要一些其他工具(XML,一个C#库)来表达你的方面。

最后,您可以使用MethodRental来“绕道”现有代码,即拦截方法调用以创建一种运行时多态性。例如,如果您的客户端代码使用一些动态生成的类RegistryStore来通过GetConfig进行一些配置,那么您可以重写方法的IL以更改RegistryStore.GetConfig的实现以使用而是文件系统。您无需更改客户端代码即可完成此操作。