.NET 3.5 - Stackframe的getmethod返回一个前缀为未知字符的属性名称

时间:2012-12-14 12:29:16

标签: asp.net .net-3.5 stack-trace jit

ISSUE:StackFrame.GetMethod()返回前缀为未知字符的属性名称( myProperty返回为__XY_myProperty )。

最近我们在现有类中添加了一个属性。该类用于ASP.NET。此类中的每个属性都调用一个自定义securitycheck函数,该函数使用stacktrace来获取被调用者的方法名称,以便根据该名称执行操作。

问题是,StackFrame在运行时期间返回此新添加的属性名称( myProperty ),其前缀为未知字符( __ XY_myProperty )。这仅在生产机器上发生。我们无法在具有类似设置的任何其他机器中重现。

以下是代码示例:

    // comments
    public returntype myProperty
    {
        get
        {
            security.checkSecurity();
            return returntype();
        }
        set
        {
            security.checkSecurity();
            if (value == null)
            {
                Row["abc"] = anothervale;
                                }
            else
            {
                Row["xyz"] = value;
            }
        }
    }
    // comment
StackFrame.GetMethod()中的security.checkSecurity()调用将myProperty方法名称返回为:__ XY_myProperty

StackFrame.GetMethod()调用未在上例中显示。)

我们尝试的是:

  1. 清除ASP.NET缓存
  2. 比较.NET补丁
  3. 重新启动服务器
  4. 这些都没有解决问题。

    服务器信息:

    • Windows 2003
    • 在VMWare上运行(JIT是否在VMWare上进行了不同的优化?)
    • IIS 6
    • NET 3.5
    • 以发布模式构建的ASP.NET项目
    • 在调试模式下编译的DLL,使堆栈跟踪正常运行

1 个答案:

答案 0 :(得分:0)

答案是:

安装在计算机上的分析器正在改变代码检测的MSIL代码。

代码检测是在将代码提供给.NET运行库以供执行时能够修改代码的过程。当CLR加载一个类并执行其方法时,该方法的IL代码在即时(JIT)编译过程中被编译为本机指令。作为CLR的一部分提供的Profiling API允许您拦截此过程。在方法获得JIT编译之前,您可以修改其IL代码。

解决方案:卸载了探查器,一切正常。事实证明StackTrace不可靠。