我正在尝试在泛型类中获取方法的函数指针。我一直在使用MethodInfo.MethodHandle.GetFunctionPointer()这样做,但是由于我最近一直在使用泛型类,上面的方法已经按照我的想法运行了。
请考虑以下事项:
public class Example<T>
{
public bool doSomething()
{
/*some work*/
return true;
}
}
以下所有内容都返回相同的内存地址:
typeof(Example<int>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
typeof(Example<bool>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
typeof(Example<SomeClass>).GetMethod("doSomething").MethodHandle.GetFunctionPointer()
我不确定为什么会这样。有谁可以向我解释一下?内存中是否只有该函数的一个版本?
肯定会引起一些人的注意。我正在修改游戏的代码而无法访问源代码。以这种方式注入代码是这一系列工作中的常见做法。只要原始的dll文件没有直接修改,游戏的EULA也特别允许这样的注入。
答案 0 :(得分:1)
那是因为,正如Anders Hejlsberg(首席C#架构师)在article中所述:
现在,我们接下来要做的是所有有价值的类型实例化 类型 - 例如
List<int>
,List<long>
,List<double>
,List<float>
- 我们 创建可执行本机代码的唯一副本。所以List<int>
得到了 它自己的代码。List<long>
获取自己的代码。List<float>
有自己的 码。对于所有引用类型,我们共享代码,因为它们是 代表性相同。它只是一个指针。
在您的示例中,bool
和int
是值类型。他们每个人都有自己的副本,所以他们有不同的指针doSomething
。 SomeClass
是引用类型(我假设)。因此它与其他引用类型共享其代码,但不与值类型共享。因此它也有不同的doSomething
指针(与bool
和int
版本不同)。如果您使用其他引用类型(SomeOtherClass
) - 它将与SomeClass
doSomething
版本具有相同的指针。