20

.NET のスタック フレームからすべてのパラメータ値を取得できるようにしたいと考えています。Visual Studio デバッガーでコール スタックの値を確認できる方法と少し似ています。私のアプローチは、StackFrame クラスを使用してから、 ParameterInfo配列に反映することに集中しています。リフレクションとプロパティで成功しましたが、これは少しトリッキーです。

これを達成するためのアプローチはありますか?

これまでのコードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Go(1);
    }
}

public class A
{
    internal void Go(int x)
    {
        B b = new B();
        b.Go(4);
    }
}

public class B
{
    internal void Go(int y)
    {
        Console.WriteLine(GetStackTrace());

    }
    public static string GetStackTrace()
    {
        StringBuilder sb = new StringBuilder();
        StackTrace st = new StackTrace(true);
        StackFrame[] frames = st.GetFrames();

        foreach (StackFrame frame in frames)
        {
            MethodBase method = frame.GetMethod();

            sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name);
            ParameterInfo[] paramaters = method.GetParameters();
            foreach (ParameterInfo paramater in paramaters)
            {
                sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString());
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

出力は次のようになります。

SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args

私はそれがもっとこのように見えることを望みます:

SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main

ちょっとした文脈のために、私の計画は、私自身の例外をスローするときにこれを試して使用することでした. 私はあなたの提案をより詳細に見て、それが適切であるかどうかを確認します.

4

2 に答える 2

8

その方法ではできないようです。メソッドとそのパラメーターに関するメタ情報のみを提供します。コールスタック時の実際の値ではありません。

ContextBoundObjectからクラスを派生させ、 IMessageSinkを使用してすべてのメソッド呼び出しとパラメーターの値から通知を受けることを提案する人もいます。これは通常、.NET Remotingに使用されます。

もう 1 つの提案は、デバッガーを作成することです。これが、IDE が情報を取得する方法です。Microsoft には、ソース コードを入手できるMdbgがあります。または、CLR プロファイラーを作成します。

于 2008-09-16T18:13:42.390 に答える