C#通用对象函数指针,相同的地址?

时间:2018-03-16 02:36:28

标签: c# generics reflection function-pointers cil

我正在尝试在泛型类中获取方法的函数指针。我一直在使用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也特别允许这样的注入。

1 个答案:

答案 0 :(得分:1)

那是因为,正如Anders Hejlsberg(首席C#架构师)在article中所述:

  

现在,我们接下来要做的是所有有价值的类型实例化   类型 - 例如List<int>List<long>List<double>List<float> - 我们   创建可执行本机代码的唯一副本。所以List<int>得到了   它自己的代码。 List<long>获取自己的代码。 List<float>有自己的   码。对于所有引用类型,我们共享代码,因为它们是   代表性相同。它只是一个指针。

在您的示例中,boolint是值类型。他们每个人都有自己的副本,所以他们有不同的指针doSomethingSomeClass是引用类型(我假设)。因此它与其他引用类型共享其代码,但不与值类型共享。因此它也有不同的doSomething指针(与boolint版本不同)。如果您使用其他引用类型(SomeOtherClass) - 它将与SomeClass doSomething版本具有相同的指针。