MethodRental类的实际用途是什么?

12
根据MSDN MethodRental 类,可以更改动态模块的方法体。但由于其限制,我无法想到实际用途。谷歌也没有帮助我。

有什么想法可以用这个类吗?

2个回答

6

我不确定你所指的限制是什么。显然,这只能在由MethodBuilder动态生成的方法上工作。从装载程序集中加载的IL即时编译的类方法无法被替换。

一个使用案例是为支持更改已定义类的方法(猴子补丁)的动态语言实现运行时。像Ruby、Python、Javascript等语言。


6
这类似于ICorProfilerCallback::JITCompilationStartedICorProfilerInfo::SetILFunctionBody结合使用,但有更多的限制。 ICorProfiler*类可用于对几乎任何托管方法进行运行时检测。 有一些分析工具和调试器使用这些工具来收集有关正在运行的进程的信息。
您可以使用MethodRental来诊断代码问题。 以下是一些示例:
  • 函数进入/退出将为您提供执行跟踪,您可以从中推导出分析数据。
  • 仪器化同步原语可以帮助您诊断竞态条件。
  • 仪器化基本块可以帮助您确定代码覆盖范围。
您还可以使用MethodRental增强现有代码的功能。 比如面向方面的编程。 您可以将安全性、日志记录或其他横切设计问题“编织”到现有代码中。不过这需要某些其他设施(XML、C#库)来表达您的方面。
最后,您可以使用MethodRental来“绕过”现有代码,即拦截方法调用以创建一种运行时多态性。 例如,如果您有客户端代码使用某个动态生成的类RegistryStore通过GetConfig获取一些配置,则可以重写该方法的IL以更改RegistryStore.GetConfig的实现方式,以使用文件系统。 您可以在不更改客户端代码的情况下执行此操作。

你不能在AOP中使用MethodRental,因为它仅支持动态方法,对吧? - Giorgi
1
@Giorgi:抱歉,我并不是有意误导。你可以在AOP中使用它,但仍然会受到MethodRental的限制,即只能在动态方法/程序集上使用。根据你想要做什么,这可能一点用处都没有。尽管如此,我列出的所有用途都有同样的基本限制。 - Chris Schmich
感谢你的回答。由于限制非常有限,所以我无法想到可能的用途。 - Giorgi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接