是MethodBody的结果.GetILAsByteArray方法正在缓存?如果是,如何清除缓存?

本文关键字:缓存 何清除 清除 如果 方法 GetILAsByteArray MethodBody 结果 | 更新日期: 2023-09-27 18:06:11

作为一名android游戏开发者,我使用的是MethodBody。GetILAsByteArray方法获取IL代码,以检测用户使用其他应用程序(例如Cheat Engine)是否修改(注入)了给定的方法。例如,

class A
{
    public foo()
    {
        // do something here.
    }
    public static byte[] GetILByteCode() {
        return typeof(A).GetMethodInfo("foo").GetMethodBody().GetILAsByteArray();
    }
}

如果我在函数"foo"被注入后调用函数A.GetILByteCode(),我可以获得函数"foo"的注入版本。

如果我先调用A.GetILByteCode(),然后在foo中注入一些代码。当我再次调用A.GetILByteCode()时,它将返回函数"foo"的原始版本,而不是注入的版本。

似乎GetILAsByteArray()的结果被缓存了。

所以我的问题是,我们可以清除GetILAsByteArray()的缓存,并获得目标方法的最新IL代码吗?

是MethodBody的结果.GetILAsByteArray方法正在缓存?如果是,如何清除缓存?

因为反射是非常昂贵的。.net运行时缓存由反射拉出的类型,以及由反射调用的每个缓存成员。

我相信你可以尝试耗尽类型缓存,因为它只有几个成员(我认为它是16个成员)。成员缓存可能是无限的。

然而,如果他们使用cheatengine,我不认为他们改变了IL,而是改变了实际的代码。所以我认为你在这里做不了什么。

CLR jit编译每个被调用的方法,我不知道Mono是否提供解释模式。