2

問題:StackFrame.GetMethod()不明な文字が前に付いたプロパティ名を返します(myPropertyは__XY_myPropertyとして返されます)。

最近、既存のクラスにプロパティを追加しました。このクラスはASP.NETで使用されます。このクラスのすべてのプロパティは、スタックトレースを使用して呼び出し先のメソッド名を取得し、その名前に基づいてアクションを実行するカスタムセキュリティチェック関数を呼び出します。

問題は、実行時に不明な文字(__XY_myPropertyStackFrame )が付加されたこの新しく追加されたプロパティ名(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()call inは、 security.checkSecurity()myPropertyメソッド名を次のように返します。__XY_myProperty

StackFrame.GetMethod()上記の例には示されていません。)

私たちが試したのは:

  1. クリアされたASP.NETキャッシュ
  2. 比較された.NETパッチ
  3. サーバーを再起動しました

これらのどれも問題を解決しませんでした。

サーバー情報:

  • Windows 2003
  • VMWareで実行されます(JITはVMWareで異なる方法で最適化されますか?)
  • IIS 6
  • NET 3.5
  • リリースモードで構築されたASP.NETプロジェクト
  • スタックトレースを正しく動作させるためにデバッグモードでコンパイルされたDLL
4

1 に答える 1

0

答えは次のとおりです。

コンピューターにインストールされたプロファイラーが、コード インストルメンテーションの MSIL コードを変更していました。

コード インストルメンテーションは、コードが実行のために .NET ランタイムに渡されるときにコードを変更できるようにするプロセスです。CLR がクラスをロードしてそのメソッドを実行すると、メソッドの IL コードは、ジャストインタイム (JIT) コンパイル プロセス中にネイティブ命令にコンパイルされます。CLR の一部として提供されるプロファイリング API を使用すると、このプロセスをインターセプトできます。メソッドが JIT コンパイルされる前に、その IL コードを変更できます。

解決策: プロファイラーをアンインストールすると、すべて正常に動作します。StackTrace が信頼できないことが証明されました。

于 2013-02-26T19:39:26.960 に答える