一旦将.NET程序集加载到内存中,是否可以使用托管指针来更改它?

时间:2011-04-17 03:12:22

标签: .net pointers clr metaprogramming

鉴于.NET元数据表格式包含显示程序集可能位于内存中的实际RVAs,是否可以使用CLR上的托管指针来访问存储程序集的内存中的位置,以便它可以在加载到内存后修改吗?

1 个答案:

答案 0 :(得分:1)

技术上是的,它是可能的(假设FullTrust +不安全的代码) - 指针是指针,托管代码一旦被JIT控制就是非托管代码。也就是说,对于任何超出实验的事情来说,它似乎都是一种灾难。你将无法修改IL,因为它可能已经被JIT了,所以你必须找到JIT代码,并希望CLR不会从你下面重新定位它或者重新JIT代码(两者都允许这样做)。

如果你真的想这样做,有更简单的方法 - 一些元编程/模拟框架使用CLR Profiling API来完成类似的技巧(运行之前,运行之后,替换方法impl等)。即使我不会投入生产 - 简单的方式来引发简历产生事件,因为那些钩子并没有真正测试稳定性到相同程度(例如,它们泄漏,以奇怪的方式失败等)。 :)