C# 泛型对象函数指针,相同的地址



>我正在尝试获取泛型类中方法的函数指针。我一直在使用 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>有自己的 法典。对于所有引用类型,我们共享代码,因为它们是 在代表性上相同。这只是指针。

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

相关内容

  • 没有找到相关文章

最新更新