>我正在尝试获取泛型类中方法的函数指针。我一直在使用 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()
我不确定这是为什么。谁能向我解释一下?内存中真的只有一个版本的函数吗?
这当然引起了一些人的注意。我正在修改游戏代码,而无需访问源代码。以这种方式注入代码是这项工作中的常见做法。游戏的 EULA 也特别允许此类注入,只要不直接修改原始 dll 文件即可。
这是因为,正如 Anders Hejlsberg(首席 C# 架构师(在本文中所说:
现在,我们要做的就是针对所有有价值的类型实例化 类型(如
List<int>
、List<long>
、List<double>
、List<float>
创建可执行本机代码的唯一副本。所以List<int>
得到 它自己的代码。List<long>
有自己的代码。List<float>
有自己的 法典。对于所有引用类型,我们共享代码,因为它们是 在代表性上相同。这只是指针。
在您的示例中,bool
和int
是值类型。他们每个人都有自己的副本,因此他们有不同的指针来doSomething
。 SomeClass
是引用类型(我假设(。因此,它与其他引用类型共享其代码,但不与值类型共享。因此,它也具有不同的doSomething
指针(不同于bool
和int
版本(。如果您使用其他引用类型 ( SomeOtherClass
( - 它将具有与doSomething
版本的SomeClass
相同的指针。