- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为 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/
对于像下面这样没有局部变量的简单方法 public static int Test1(short i, long j) { j = i + j; switch (j) {
(首先,这是一篇很长的文章,但别担心:我已经实现了所有这些,我只是在询问您的意见或可能的替代方案。) 我在执行以下操作时遇到问题;我很感激一些帮助: 我得到一个 Type作为参数。 我使用反射定义了一
我正在考虑实例方法 Object.Equals(Object)。使用反射,可以将此方法的 IL 作为字节数组获取,如下所示: var mi = typeof(object).GetMethod("Eq
我正在为一个简单的 .Net 打包程序开发一个解包程序。 我想使用 dnlib 从加载的程序集中执行一个方法。 我不能使用 System.Reflection,因为加壳器会打包原始可执行文件,然后它会
作为 Android 游戏开发者,我使用 MethodBody.GetILAsByteArray 方法获取 IL 代码,以检测给定方法是否已被用户使用其他应用程序(例如 Cheat Engine )修
我想知道是否有人可以向我解释一下。出于某种原因,lambda 的 MethodBody 似乎在调用后发生了变化。 以下代码片段使用一个外部变量创建一个简单的 lambda 并检查方法主体。 i
我是一名优秀的程序员,十分优秀!