根据MSDN MethodRental 类,可以更改动态模块的方法体。但由于其限制,我无法想到实际用途。谷歌也没有帮助我。
有什么想法可以用这个类吗?
我不确定你所指的限制是什么。显然,这只能在由MethodBuilder动态生成的方法上工作。从装载程序集中加载的IL即时编译的类方法无法被替换。
一个使用案例是为支持更改已定义类的方法(猴子补丁)的动态语言实现运行时。像Ruby、Python、Javascript等语言。
ICorProfilerCallback::JITCompilationStarted
与ICorProfilerInfo::SetILFunctionBody
结合使用,但有更多的限制。 ICorProfiler*
类可用于对几乎任何托管方法进行运行时检测。 有一些分析工具和调试器使用这些工具来收集有关正在运行的进程的信息。MethodRental
来诊断代码问题。 以下是一些示例:
MethodRental
增强现有代码的功能。 比如面向方面的编程。 您可以将安全性、日志记录或其他横切设计问题“编织”到现有代码中。不过这需要某些其他设施(XML、C#库)来表达您的方面。MethodRental
来“绕过”现有代码,即拦截方法调用以创建一种运行时多态性。 例如,如果您有客户端代码使用某个动态生成的类RegistryStore
通过GetConfig
获取一些配置,则可以重写该方法的IL以更改RegistryStore.GetConfig
的实现方式,以使用文件系统。 您可以在不更改客户端代码的情况下执行此操作。
MethodRental
的限制,即只能在动态方法/程序集上使用。根据你想要做什么,这可能一点用处都没有。尽管如此,我列出的所有用途都有同样的基本限制。 - Chris Schmich