我正在尝试查看是否可以在某些旧版代码中将异常分组在一起。我有一个Logger
类,它接受异常并将其记录下来。理想情况下,我想要某种引发异常的唯一标识符(无论文本如何)。
我偶然发现了Exception.TargetSite.MethodHandle
。这似乎是一个整数,我可以用它来做我想做的事情。在调试中,我多次引发异常,并注意到这些值似乎是静态的,太棒了!
所以我移动了异常,以确认如果异常不同,值更改了,它也会改变,那就太好了!
我将异常放回原处,然后再次进行测试,期望返回原始整数值,但事实并非如此,它返回的是完全不同的值。 :(
似乎每次我重新编译源时,这些值都会更改。
这使我想到了我的问题。 MethodHandle
are not great上的文档:
获取方法的内部元数据表示形式的句柄。
谢谢微软非常有见地。我以为MethodHandle
是该方法在内存中的某种地址?虽然我不确定。谁能解释这个值何时以及为什么改变?它标记在程序集中还是在堆栈或堆上的内存地址?流程回收时会改变吗?
最佳答案
您看到的值是CLR中指向MethodDesc
结构的指针,不能保证保持相同的值。如果需要在模块中标识方法,可以使用其MetadataToken
,但是如果重新编译模块,则该方法可能会更改。