gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:55:10 24 4
gpt4 key购买 nike

作为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com