Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取调用对象';什么是哈希码?_C#_Reflection - Fatal编程技术网

C# 获取调用对象';什么是哈希码?

C# 获取调用对象';什么是哈希码?,c#,reflection,C#,Reflection,这可能是一个重复的问题,但我还没有看到这个确切的问题,也没有看到类似的问题被问到/回答的日期比.NET4的发布日期更新 我正在寻找一种临时的破解方法,它允许我查看调用堆栈并获取堆栈中的所有调用对象(不是方法,而是包含方法的实例)。最终我需要他们的哈希代码 这可能吗 编辑: 无论在我的问题中是否出现这种情况,我真正想问的是,是否有一种简单的/内置的方法来做到这一点。真的,只是权宜之计,直到我可以对系统的其他部分进行突破性的更改。谢谢你的回答。看到他们之后,我想我会等待……:) 试试。您可以通过创建

这可能是一个重复的问题,但我还没有看到这个确切的问题,也没有看到类似的问题被问到/回答的日期比.NET4的发布日期更新

我正在寻找一种临时的破解方法,它允许我查看调用堆栈并获取堆栈中的所有调用对象(不是方法,而是包含方法的实例)。最终我需要他们的哈希代码

这可能吗

编辑:


无论在我的问题中是否出现这种情况,我真正想问的是,是否有一种简单的/内置的方法来做到这一点。真的,只是权宜之计,直到我可以对系统的其他部分进行突破性的更改。谢谢你的回答。看到他们之后,我想我会等待……:)

试试。

您可以通过创建类的实例并检查其中的对象来获取调用堆栈。查看成员列表,这似乎并没有显示实例,只是显示了类和方法。

这仅适用于非托管API,特别是CLR分析API。除了用于实现分析和调试工具之外,我对它了如指掌。你必须在谷歌上搜索它,并在一周内将其投入生产。如果可能的话,放弃你的计划,找一个替代方案。告诉我们你想做什么,我们可以帮你

你想在这里实现什么

看看我大约一个月前回答的一个类似问题:。你可能会从中得到一些灵感。或者你可能会觉得它太难看了(后者为+1)

如果您只想在程序会话中组装“唯一”的调用路径,请直接操作:我非常确定使用AOP weaver和线程本地存储。那样就不难了

警告1:哈希对于一般的.NET对象不是很有用 随机对象的哈希代码可能随其在堆中的位置而变化。仅供参考:在MONO上,禁用了移动堆分配器后,Object::GetHash就是这样一个漂亮的代码块()

当然,使用移动分配器时,要保证在对象的整个生命周期内都有一个恒定的哈希值,事情会稍微复杂一些,但您要明白一点:每个运行时将生成不同的哈希值,并且完成的分配量将改变相同对象未来的默认哈希代码

警告2:堆栈将包含外来帧 即使您通过提供适当的确定性散列函数来修复该部分,您也将要求每个stackframe都是“recgonizable”类型。情况可能不会是这样。如果您使用类似于LINQ、匿名类型、静态构造函数、委托的任何东西,则肯定不会这样做;各种各样的事情可能是将堆栈帧与(匿名)助手类型的堆栈帧交错,甚至是JIT编译器为优化尾部递归而发明的性能蹦床、大型切换跳转表或在多个重载之间共享代码

要点:堆栈分析很难:如果要进行堆栈分析,就必须使用适当的API

结论: 一定要玩得开心。但请注意这些建议

  • 您的需求是非标准的(由不支持它的运行库强调);这通常是一个迹象:你正在解决一个独特的问题(但重新考虑选择的工具?),或者你正在以错误的方式解决它
  • 通过使用一些手写的模拟代码生成流图,而不是尝试挂接到CLR VM,您可能会获得更多信息
  • 如果要这样做,请使用适当的API(可能是探查器API,因为采样探查器会准确地保存以下内容:每隔这么多指令堆叠“指纹”)
  • <>如果您真的必须通过使用代码来完成它,请考虑使用AOP
    您可以获得如下类型
    var type=newstacktrace.GetFrame(1.GetMethod().DeclaringType#else
    /*
     * Wang's address-based hash function:
     *   http://www.concentric.net/~Ttwang/tech/addrhash.htm
     */
        return (GPOINTER_TO_UINT (obj) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
    #endif