2010-05-17 87 views

回答

6

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

您可以使用MethodRental来进行诊断目的的仪器代码。一些例子:

  • 功能输入/退出会给你一个执行轨迹,你可以用它来派生分析数据。
  • 检测同步原语可以帮助您诊断竞争条件。
  • 检测基本块可帮助您确定代码覆盖率。

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

最后,你可以使用MethodRental为“弯路”现有的代码,即拦截方法调用,以创建一种运行时多态性。例如,如果您有使用一些动态生成的类RegistryStore通过GetConfig得到一些配置客户端的代码,你可以重写方法的IL改变RegistryStore.GetConfig执行使用文件系统来代替。你可以做到这一点,而无需更改客户端代码。

+0

您不能使用MethodRental for AOP,因为它只支持动态方法,对吗? – Giorgi 2010-05-27 10:57:43

+1

@Giorgi:对不起,我的意思不是误导。您可以将它用于AOP,但您仍然会拥有'MethodRental'强加的相同约束:具体而言,您只能在动态方法/程序集上使用它。根据你想要做的事情,这可能根本没用。尽管我列出的所有用途都具有相同的基本约束。 – 2010-05-27 11:16:39

+0

感谢您的回答。由于限制条件非常有限,这是因为我无法想到可能的用法。 – Giorgi 2010-05-27 11:46:55

6

不确定你的意思是什么限制。显然,这只能在MethodBuilder生成的动态生成的方法上运行。从装配中加载的IL编译JIT的类方法不能被替换。

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