c# - MethodBody.GetILAsByteArray 方法的结果是否被缓存?如果是这样,如何清除缓存?

标签 c# android mono unity3d il

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

class A
{
    public foo()
    {
        // do something here.
    }

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

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

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

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

那么我的问题是,是否可以清空GetILAsByteArray()的缓存,获取目标方法最新的IL代码?

最佳答案

因为反射非常昂贵。 .net 运行时缓存通过反射提取的类型,并在每个缓存成员中通过反射调用。

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

但是,如果他们使用的是 cheatengine,我认为他们不是在更改 IL,而是在实际更改实际的 jitted 代码。所以我认为您在这里无能为力。

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

关于c# - MethodBody.GetILAsByteArray 方法的结果是否被缓存?如果是这样,如何清除缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979601/

相关文章:

C# Wpf 绑定(bind)不适用于标签

c# - C#中的printf是什么

android - 是否可以使复选框/单选按钮无法选中?

mono - 使用嵌入式 Mono 调试如何在 C# 代码中设置断点?

c# - 在命令行中调试 c#

c# - 强制用户在 C# 中使用正确的泛型方法

c# - Entity Framework - 使用多个 edmx 文件

java - 如何更改弹出布局的背景?

android - 从 Web 开发到 Android 开发

c# - MonoTouch 中的自定义 UIButton 颜色